我知道这种类似的问题 ,但它并没有给我的问题作出回应。
我已经写了两个.dll
使用Visual Studio 2010中的一个是C ++秒,与已用C ++编写的SDK进行通信。 另一种是针对C ++库中的C#包装,以便它可以在C#的环境中使用。
我的计划是,这将让我用我的代码在Unity3D
,但显然事实并非如此。 这似乎是Unity3D
不允许我导入.dll
,如果他们不是S作为资产.NET
程序集。 所以,我可以加我的C#的包装,而不是C ++ DLL。
这导致DllNotFoundException
每当我尝试访问C ++库。 我曾尝试简单地复制C ++库到Assets/Plugins
文件夹,但给出相同的结果。
有没有办法正确地做到这一点? 这是我的项目设置的一个非常重要的组成部分。
的问题是,当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的前/调用到本机库。
需要注意的是DllNotFoundException可以通过调试,而不是发布构建统一的DLL造成的!
一个简单的疏忽,可能会导致头痛。