如何构建在unity/c#中导入的c++ dll

Posted

技术标签:

【中文标题】如何构建在unity/c#中导入的c++ dll【英文标题】:How to build a c++ dll imported in unity/c# 【发布时间】:2021-05-30 16:25:44 【问题描述】:

我想构建一个 c++ dll,但我发现我的 dll 可能有问题。我刚刚为 ARM64 构建了一个简单的函数,将其部署到 Hololens2 中。 头文件.h文件:

#include "pch.h"


#ifdef  MYRESEARCHMODE_EXPORTS
#define DllExport __declspec(dllexport) 
#else  
#define  DllExport _declspec(dllimport)
#endif

#ifdef _cplusplus
extern "C"

#endif

class  DllExports
  
  public:
      DllExport   static  int __stdcall DOUT();

  ;  

#ifdef _cplusplus   

#endif

The .cpp file like this:
#define MYRESEARCHMODE_EXPORTS

#include "pch.h"
#include"myResearchMode.h"

  int __stdcall DllExports::DOUT()

  return 123;


并且我使用了Dumpbin来测试它是否构建成功。 然后我在 Unity/Plugin 中导入它

    [DllImport("myResearchMode.dll", EntryPoint = "?DOUT@DllExports@@SAHXZ  ", CallingConvention = CallingConvention.Cdecl)]
    public static extern int DOUT();

但我发现结果未能显示。我想我的 dll 有问题,我忘记设置一些设置了吗?或者错误在哪里?

【问题讨论】:

docs.unity3d.com/Manual/NativePlugins.html 我建议您先看看您是否可以在本地运行您的 DLL 的 windows\linux 变体。然后在您的目标设备上尝试官方示例:github.com/Unity-Technologies/NativeRenderingPlugin 一旦两者都有效,您可以调查您可能缺少什么的差异。 【参考方案1】:

您是如何创建 C++ DLL 的?在 Visual Studio 中开始创建 C++ DLL 时,您选择了哪个项目模板作为脚手架?如果您将 C++ DLL 创建为 Win32 二进制文件,它会在 HoloLens2 上运行时引发异常,因为 Unity 在构建 WSA 项目时不会包含标准 Win32 二进制文件。因此,建议重新创建或移植本机 win32 DLL 到 UWP DLL,请参阅此处的指导:To port a native DLL to the UWP without creating a new project

【讨论】:

以上是关于如何构建在unity/c#中导入的c++ dll的主要内容,如果未能解决你的问题,请参考以下文章

如何允许组件中的函数访问构造函数中导入的工厂?

如何从 Xcode 中导入的 .dae 中访问混合形状

在“发布”构建配置中看不到在桥接头中导入的头,但在“调试”构建配置中可见

如何更新/覆盖当前在 R 中导入的 csv 文件

在 DLL 中导出的 C++ 函数中使用 #ifdef 块

在本机 C++ 项目中导入 C# dll 库