问题是当 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 到该本地库之前调用将完整路径传递给本地库。