Unity如何使用本机dll或转换为托管

Posted

技术标签:

【中文标题】Unity如何使用本机dll或转换为托管【英文标题】:Unity how to use native dll or convert to managed 【发布时间】:2019-05-28 14:12:34 【问题描述】:

我正在尝试在用于 hololens 的统一项目中使用本机 c++ UWP 组件。

我已经成功使用了托管 dll,但我不知道如何使用这个原生 dll/

我想要么将 dll 转换为托管 dll,要么想办法使用本机 dll。

【问题讨论】:

您是否尝试在 .Net 项目中使用 dll?如果是这样,将自动生成 dll 的互操作性.. 我们称其为 CCW - Com Callable Wrapper.. 【参考方案1】:

你试过这个:Wrap native DLL for C#(第二个代码块很有趣)?

转换 dll 是不可能的 afaik。您可以将 c++ 代码转换为 c#,然后创建托管 dll,但导入本机 dll 会更容易。

编辑:应该提到我并不是特别指这个问题,只是第二个代码块,dll 被导入的地方。

【讨论】:

【参考方案2】:

内存管理在 C++ 中的工作方式完全不同,因此无法在 C# 中直接使用 C++ 库。

C++ 使用name mangling 对方法签名进行编码,并且此名称修饰不是标准化的(这意味着它取决于编译器)。 要解决此问题,您需要使用静态“std 调用”将它们导出到外部“C”部分。

这意味着您需要为 C# 中使用的每个实例方法创建一个包含静态方法的包装器。

来自Unity Manual(注意导入dll对于ios来说是不同的,如下代码所示)

    using UnityEngine;
    using System.Runtime.InteropServices;

    class SomeScript : MonoBehaviour 

       #if UNITY_IPHONE

       // On iOS plugins are statically linked into
       // the executable, so we have to use __Internal as the
       // library name.
       [DllImport ("__Internal")]

       #else

       // Other platforms load plugins dynamically, so pass the name
       // of the plugin's dynamic library.
       [DllImport ("PluginName")]

       #endif

       private static extern float FooPluginFunction ();

       void Awake () 
          // Calls the FooPluginFunction inside the plugin
          // And prints 5 to the console
          print (FooPluginFunction ());
       
    

您也可以阅读此Unity Answer,了解更多信息。

【讨论】:

以上是关于Unity如何使用本机dll或转换为托管的主要内容,如果未能解决你的问题,请参考以下文章

如何将 cli::array 从本机代码转换为本机数组?

使用包含托管类的 /CLR 标志构建的本机 dll

本机 C++ 通过代理 C++ 托管 dll 使用 C# dll

APK 文件如何包含 DLL 文件? Android可以运行DLL文件吗?

转换为C ++ CLI托管对象引用的本机指针?

运行使用 /clr 构建的 DLL 的本机 C++ 应用程序时访问冲突