7

我的 C# 应用程序 (.NET Framework 4.0) 使用以下代码导入外部非托管 DLL:

[DllImport("myDLL.dll"), EntryPoint="GetLastErrorText"]
private static extern IntPtr GetLastErrorText();

不幸的是,第三方 DLL 中似乎存在错误。作为一种解决方法,我需要卸载 DLL 并在之后重新加载它。我怎样才能做到这一点?我看过几篇文章,但它们都在谈论托管 DLL。

4

3 回答 3

5

您可以围绕管理对它的访问的库编写一个包装器。然后您可以使用本机方法来调用该库。看看这篇博文。

于 2012-12-20T08:00:33.323 回答
4

我认为您需要继续使用 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);
于 2012-12-20T08:01:58.760 回答
2

您可以尝试使用(来自 WinAPI)来执行此操作,而不是使用DllImport导入 DLL,LoadModule然后使用GetProcAddressFreeLibrary执行您需要的操作,即调用其中的函数并卸载/重新加载它。

看这里。

如果您使用 C++/CLR 将 C# 和非托管 DLL 粘合在一起,可能会更漂亮/易于管理。

于 2012-12-20T08:00:21.707 回答