我的 C# 应用程序 (.NET Framework 4.0) 使用以下代码导入外部非托管 DLL:
[DllImport("myDLL.dll"), EntryPoint="GetLastErrorText"]
private static extern IntPtr GetLastErrorText();
不幸的是,第三方 DLL 中似乎存在错误。作为一种解决方法,我需要卸载 DLL 并在之后重新加载它。我怎样才能做到这一点?我看过几篇文章,但它们都在谈论托管 DLL。
您可以围绕管理对它的访问的库编写一个包装器。然后您可以使用本机方法来调用该库。看看这篇博文。
我认为您需要继续使用 LoadLibrary/FreeLibrary/GetProcAddress,如下面的dllimport 和 getProcAddress 之间的差异:缩写示例(无错误处理)所示:
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
private delegate Bool BarType(Byte arg);
...
IntPtr pDll= LoadLibrary("foo.dll");
IntPtr pfunc = GetProcAddress(pDll, "bar");
BarType bar = (BarType)Marshal.GetDelegateForFunctionPointer(pFunc, typeof(BarType));
var ok = bar(arg);
FreeLibrary(pDll);
您可以尝试使用(来自 WinAPI)来执行此操作,而不是使用DllImport
导入 DLL,LoadModule
然后使用GetProcAddress
并FreeLibrary
执行您需要的操作,即调用其中的函数并卸载/重新加载它。
如果您使用 C++/CLR 将 C# 和非托管 DLL 粘合在一起,可能会更漂亮/易于管理。