我可以用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的简短示例代码。#包括"stdafx.h">
#include <winrtbase.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的所有资源。
- 试图在visual studio上用C++创建一个桌面应用程序
- Qt QML桌面应用程序自动化测试
- 需要有关使用 Visual Studio 17 将 QT 桌面应用程序打包为 AppX 格式的指导
- 我可以用C++/WinRT编写一个DLL,供windows桌面应用程序(而不是UWP)或Unity插件使用吗
- 在跨平台桌面/移动应用程序套件中使用 ZeroMQ 来解决架构问题
- Electron应用程序和Win32本机桌面应用程序之间的进程间通信
- QWebView 用于在桌面应用程序中运行 javascript (D3) - 当 HTML 更改时重新加载速度很慢
- 如何从桌面应用程序访问嵌入式ArangoDB
- 应用程序最小化时单击显示桌面/最小化全部
- 如何从 Windows 上的服务在未登录用户的桌面上启动应用程序
- 如何在桌面应用程序中使用WEBRTC进行语音聊天
- 如何防止从浏览器查看图像,但允许在桌面应用程序上
- 我想将使用 VTK、C++ 和 QT 开发的桌面应用程序移植到 Web 应用程序
- 如何为 QT Windows 应用程序设置不同的桌面快捷方式图标和任务栏图标不同
- 编写 Windows 桌面应用程序时,我应该在哪里跟踪我的窗口句柄?
- 在我关闭刚开始的孩子对话框并进入父母对话框之后,我的QT桌面应用程序不断崩溃
- 有没有一种方法可以测量桌面应用程序 UI 响应时间
- 在桌面应用程序中嵌入Elasticsearch
- 带有桌面应用程序的C 微服务
- Windows 10 UWP桌面桥应用程序(C ):调试构建中的VCLIBS依赖关系