私はネイティブDLLとやりとりするWebサービスで作業しています.LoadLibrary/GetModuleHandle/FreeLIbraryとGetProcAddressを使用すると、DLLが非常に安定していないため、動的にロード/アンロードされます。LoadLibrary、FreeLibrary、およびGetModuleHandle Win32関数はスレッドセーフですか?
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);
}
私はw3wp.exeのプロセスがoccationally重い負荷の下でクラッシュし、私はそれをデバッグしようとしたとき、デバッガは、多くの場合、私のNativeMethods.GetModuleHandle()関数呼び出しで停止していることに気付きました。
GetModuleHandle
はスレッドセーフではないという証拠を見つけることができなかったので、これらのkernel32.dll関数をマルチスレッド.NETアプリケーションとやりとりするときに誰もが似たような経験を得ているのだろうか?イゴールTandetnik(マイクロソフトMVP)によると、オスカー
LoadLibraryとFreeLibraryはDLLロードリストに対して相対的にスレッドセーフでなければなりません。理論的にはGetModuleHandleを使うべきですが、おそらくそのメソッドを使用する代わりにLoadLibrary/FreeLibraryペアを使用しますあなたがそれを使用している間はメモリから消えることはありません。 – tyranid