加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 08:42:10 所属栏目:百科 来源:网络整理
导读:我知道 this similar question,但它没有回应我的问题. 我使用Visual Studio 2010编写了两个.dll.一个在C中,并与用C编写的SDK进行通信.另一个是该C库的C#包装器,因此它可以在C#上下文中使用. 我的计划是让我在Unity3D中使用我的代码,但显然情况并非如此.似乎U
我知道 this similar question,但它没有回应我的问题.

我使用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在DLL搜索路径上进行第一次p / invoke调用时解决此问题.例如,通过拨打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 / inv之前,只需确保调用LoadNativeDll将完整路径传递给本机库.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读