7

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

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

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

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

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

4

3 回答 3

7

问题是当 p/invoke 运行时代码调用LoadLibrary(YourNativeDllName).

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

我个人更喜欢的解决方案是让您的托管代码 p/invoke 调用以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/invokes 到该本地库之前调用将完整路径传递给本地库。

于 2013-04-10T10:52:26.547 回答
1

当 Unity 可以找到您的 DLL,但无法找到它的依赖项时,也会发生这种情况。明显的解决方法是将依赖 DLL 也放入 /Plugins 中,或者静态链接您的依赖。

不太明显的原因是当您的 DLL 动态依赖于 Visual Studio 运行时库时,使用属性 -> C/C++ -> 代码生成 -> /MD 选项构建。将其更改为 /MT 以静态链接运行时。

于 2020-05-06T21:24:36.097 回答
1

请注意,DllNotFoundException 可能是由在调试而不是发布中构建 Unity DLL 引起的!

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

于 2017-07-05T20:46:55.800 回答