c# - 如何在 Unity3D 中使用 C++ dll?

标签 c# c++ dll unity3d

我知道 this similar question ,但它没有回应我的问题。

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

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

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

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

最佳答案

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

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

我个人更喜欢的解决方案是让您的托管代码 p/调用对 LoadLibrary 的调用,将完整的绝对路径传递给 native DLL。这样,当随后的 p/invoke 诱导调用 LoadLibrary(YourNativeDllName) 时,您的 native 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 并将完整路径传递给 native 库,然后再调用该 native 库的任何 p/invoke。

关于c# - 如何在 Unity3D 中使用 C++ dll?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15923595/

相关文章:

c - C什么时候释放struct的内存

c# - 无法在 Windows CE 上将字体更改为 "Arial"

c++ - 如何检查容器是否支持多连接?

c++ - 问题生产者消费者中的竞争条件

c++ - lambda 中的 Const 参数

.net - IIS/Sharepoint GAC 上的 DLL 缓存问题

c++ - CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS不涵盖全局变量

c# - 在 WCF 中运行时切换服务协定实现

c# - 从注册表中的 DWORD 中获取十进制值

c# - 如何模拟登录用户并访问 unc 文件夹?