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或转换为托管的主要内容,如果未能解决你的问题,请参考以下文章
本机 C++ 通过代理 C++ 托管 dll 使用 C# dll