Reload a DLL which has been imported with DllImpor

2019-05-09 11:06发布

My C# application (.NET Framework 4.0) imports an external unmanaged DLL with the following code:

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

Unfortunately there seems to be a bug in the third-party DLL. As a workaround I would need to unload the DLL and reload it afterwards. How can I do this? I've seen several posts but they all talk about managed DLLs.

3条回答
地球回转人心会变
2楼-- · 2019-05-09 11:38

Rather than using DllImport to import the DLL, you could try using LoadModule (from WinAPI) to do so, and then use GetProcAddress and FreeLibrary to do what you need as far as calling functions in it and unloading/reloading it.

See here.

Might be a bit prettier/manageable if you used C++/CLR to glue C# and the unmanaged DLL together.

查看更多
别忘想泡老子
3楼-- · 2019-05-09 11:49

I think you'll need to go down to using LoadLibrary/FreeLibrary/GetProcAddress as shown in Difference between dllimport and getProcAddress : Abbreviated sample (no error handling) below:

   [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);
查看更多
一纸荒年 Trace。
4楼-- · 2019-05-09 11:55

You can write a wrapper around the library that manages the access to it. Then you can use native methods to call the library. Take a look at this blog post.

查看更多
登录 后发表回答