如何使用Unity3D一个C ++的dll?(How to use a C++ dll in Uni

2019-08-21 06:25发布

我知道这种类似的问题 ,但它并没有给我的问题作出回应。

我已经写了两个.dll使用Visual Studio 2010中的一个是C ++秒,与已用C ++编写的SDK进行通信。 另一种是针对C ++库中的C#包装,以便它可以在C#的环境中使用。

我的计划是,这将让我用我的代码在Unity3D ,但显然事实并非如此。 这似乎是Unity3D不允许我导入.dll ,如果他们不是S作为资产.NET程序集。 所以,我可以加我的C#的包装,而不是C ++ DLL。

这导致DllNotFoundException每当我尝试访问C ++库。 我曾尝试简单地复制C ++库到Assets/Plugins文件夹,但给出相同的结果。

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

Answer 1:

的问题是,当P /调用运行时代码调用的DLL没有被发现LoadLibrary(YourNativeDllName)

你可以通过确保您的DLL是在它时,其中第一的P / Invoke调用该点的DLL搜索路径上解决这个问题。 例如通过调用SetDllDirectory

我个人更喜欢是你的托管代码为P解决方案/调用到调用LoadLibrary经过完整的绝对路径本地DLL。 这样,当后续的P / Invoke诱导调用LoadLibrary(YourNativeDllName)是做,你的本机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();
    }
}

只要确保你叫LoadNativeDll传递的完整路径,本地库,你可以调用任何P的前/调用到本机库。



Answer 2:

需要注意的是DllNotFoundException可以通过调试,而不是发布构建统一的DLL造成的!

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



文章来源: How to use a C++ dll in Unity3D?
标签: c# c++ dll unity3d