Ich arbeite an einem Webdienst, der mit einer nativen DLL interagiert, und ich benutze LoadLibrary/GetModuleHandle/FreeLIbrary und GetProcAddress, um die DLL dynamisch zu laden/zu entladen, weil sie nicht sehr stabil ist.Sind LoadLibrary, FreeLibrary und GetModuleHandle Win32-Funktionen threadsicher?
public class NativeMethods
{
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr LoadLibrary(string libname);
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr GetModuleHandle(string libname);
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public static extern bool FreeLibrary(IntPtr hModule);
[DllImport("kernel32.dll", CharSet = CharSet.Ansi)]
public static extern IntPtr GetProcAddress(IntPtr hModule, string lpProcName);
}
Ich habe bemerkt, dass w3wp.exe Prozess occationally unter hohen Last abstürzt und wenn ich es der Debugger oft an meinem NativeMethods.GetModuleHandle stoppt zu debuggen versuchte (Funktionsaufruf).
Ich konnte keinen Beweis dafür finden, dass GetModuleHandle
nicht threadsicher ist, also frage ich mich, ob jemand ähnliche Erfahrungen gemacht hat, wenn er diese kernel32.dll-Funktion von multi-threaded .NET-Anwendungen interagiert?
Oscar
LoadLibrary und FreeLibrary sollten relativ zur DLL-Ladeliste Thread-sicher sein, und theoretisch sollte GetModuleHandle, aber ich würde wahrscheinlich ein LoadLibrary/FreeLibrary-Paar anstelle dieser Methode verwenden, als dann sicherstellen, dass Sie einen Verweis auf die Bibliothek haben und es kann nicht einfach aus dem Speicher verschwinden, während du es benutzt. – tyranid