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

Lee*_*ite 7 c# c++ dll unity-game-engine

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

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

我的计划是,这会让我使用我的代码Unity3D,但显然事实并非如此.似乎Unity3D不允许我将.dlls作为资产导入,如果它们不是.NET汇编.所以我可以添加我的C#包装器,但不能添加C++ dll.

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

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

Dav*_*nan 7

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

您可以通过确保DLL在DLL搜索路径上进行第一次p/invoke调用时解决此问题.例如通过电话SetDllDirectory.

我个人更喜欢的解决方案是让您的托管代码调用/调用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
    );
}
Run Code Online (Sandbox Code Playgroud)

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

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

在调用LoadNativeDll该本机库的任何p/inv之前,只需确保调用传递到本机库的完整路径.