Csharp/C#教程:如何在Unity3D中使用C ++ DLL?分享


如何在Unity3D中使用C ++ DLL?

我知道这个类似的问题 ,但它没有回应我的问题。

我使用Visual Studio 2010编写了两个.dll 。一个是用C ++编写的,并且用一个用C ++编写的SDK进行通信。 另一个是C ++库的C#包装器,因此它可以在C#上下文中使用。

我的计划是,这将让我在Unity3D使用我的代码,但显然情况并非如此。 看起来Unity3D不允许我将.dll作为资产导入,如果它们不是.NET程序集的话。 所以我可以添加我的C#包装器,但不能添加C ++ dll。

每当我尝试访问C ++库时,都会导致DllNotFoundException 。 我试过简单地将C ++库复制到Assets/Plugins文件夹中,但这会产生相同的结果。

有没有办法正确地做到这一点? 这是我项目设置中非常重要的一部分。

问题是当p / invoke运行时代码调用LoadLibrary(YourNativeDllName)时找不到DLL。

您可以通过确保DLL在第一次p / invoke调用它的DLL搜索路径上来解决此问题。 例如,通过调用SetDllDirectory

我个人更喜欢的解决方案是让您的托管代码p /调用LoadLibrary调用传递本机DLL的完整绝对路径。 这样,当后续的p / invoke引起对LoadLibrary(YourNativeDllName)调用是make时,你的本机DLL已经在进程中,因此将被使用。

 internal static class NativeMethods { [DllImport("kernel32", SetLastError = true, CharSet = CharSet.Unicode)] internal static extern IntPtr LoadLibrary( string lpFileName ); } 

然后在代码中的某个地方:

 private static IntPtr lib; .... public static void LoadNativeDll(string FileName) { if (lib != IntPtr.Zero) { return; } lib = NativeMethods.LoadLibrary(FileName); if (lib == IntPtr.Zero) { throw new Win32Exception(); } } 

在调用该本机库的任何p / LoadNativeDll ,只需确保调用LoadNativeDll将完整路径传递给本机库。

请注意,可以通过在Debug而不是Release中构建Unity DLL来引起DllNotFoundException!

一个简单的疏忽可能导致头痛。

上述就是C#学习教程:如何在Unity3D中使用C ++ DLL?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1021928.html

(0)
上一篇 2022年1月6日
下一篇 2022年1月6日

精彩推荐