[英]Can I write a DLL with C++/WinRT to be consumed by a windows desktop app(not UWP) or as a Unity plugin?
我已經嘗試用 C++/WinRT 編寫一個簡單的 DLL。 它可以通過 Windows 桌面應用程序毫無問題地導入和運行(我嘗試編寫兩個桌面應用程序,一個使用 C#,另一個使用 C++/WinRT。)
當我將它作為 Unity 的插件導入時,它運行良好,但會導致 Unity 在退出時凍結。 然后我將其縮小到一些可能的線程問題。 具體來說,如果插件在插件生成的線程上回調 Unity,則調用會通過,並且代碼運行良好,但是當我嘗試退出 Unity 編輯器時,它會凍結。
這是 DLL 的簡短示例代碼。 #include “stdafx.h”
#include <winrt\base.h>
extern "C"
{
typedef void(*testCallback)(Info info);
__declspec(dllexport) void TryAsyncWinRT(testCallback callback);
}
using namespace winrt;
using namespace Windows::Foundation;
static testCallback handler;
IAsyncAction JustDoWork()
{
co_await winrt::resume_background();
int result{};
/*
Some calculation...
*/
if (handler) {
handler(result);
}
co_return;
}
void TryAsyncWinRT(testCallback callback)
{
handler = callback;
JustDoWork();
}
我使用的編譯器是 Visual Studio 2017,安裝了 C++/WinRT 擴展。 我沒有更改 Visual Studio 提供的“DllMain”中的任何內容。 我沒有在 DLL 代碼中調用“init_apartment()”,因為我認為這是由主機應用程序完成的,因為每個應用程序只能有一個多線程單元。
如果我不回調到 Unity,就沒有問題。 如果我只使用標准庫的線程實用程序,Unity 也可以正常工作。
void JustDoWork()
{
int result{};
/*
Some calculation...
*/
if (handler) {
handler(result);
}
}
void TryAsync(testCallback callback)
{
handler = callback;
std::thread(JustDoWork).detach();
}
我覺得我一定遺漏了一些東西,但我找不到任何關於如何使用 C++/WinRT 編寫常規 DLL(不是 Windows 運行時組件)的文檔。
任何善良的靈魂都可以發光嗎? 非常感謝!
在嘗試實現 BLE 時,我偶然發現了同樣的問題。 具體來說,當我嘗試在 C++ winrt dll 中調用 C# 回調時,我的 C# 程序崩潰了,而且當我在 C# 程序中使用 C++ winrt 分配的內存時,即使我嘗試遵循內存分配建議,它也經常崩潰。
我最終完全避免了編組回調,並通過輪詢函數實現了這些機制。 我還分配了 C# 端函數調用所需的所有內存。
對我來說,這感覺像是一種解決方法,但也感覺很安全。 您可以在此處查看我如何將回調轉換為輪詢的示例。
您必須在 exe 主線程(UI 線程)中釋放 C++/WinRT DLL 的所有資源。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.