簡體   English   中英

我可以使用 C++/WinRT 編寫一個 DLL 以供 Windows 桌面應用程序(不是 UWP)或作為 Unity 插件使用嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM