重新加载已使用DllImport导入的DLL

时间:2012-12-20 07:46:51

标签: c# .net dllimport

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

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

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

3 个答案:

答案 0 :(得分:4)

您可以在库中编写一个包装器来管理对它的访问。然后,您可以使用本机方法来调用库。请查看this博文。

答案 1 :(得分:4)

我认为你需要使用LoadLibrary / FreeLibrary / GetProcAddress,如Difference between dllimport and 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);

答案 2 :(得分:2)

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

See here.

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