11

ネイティブ DLL と対話する Web サービスに取り組んでおり、LoadLibrary/GetModuleHandle/FreeLIBrary および GetProcAddress を使用して DLL を動的にロード/アンロードします。これは安定性が低いためです。

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 プロセスが高負荷時にクラッシュすることがあり、デバッグしようとすると、NativeMethods.GetModuleHandle() 関数呼び出しでデバッガーが停止することがよくあります。

スレッドセーフではないという証拠を見つけることができなかっGetModuleHandleたので、マルチスレッドの .NET アプリケーションからこれらの kernel32.dll 関数を操作するときに、似たような経験をした人はいますか?

オスカー

4

1 に答える 1

7

Igor Tandetnik(Microsoft MVP)によると。

スレッドセーフではないGDI関数は別として。HWNDおよび/またはをとるほとんどすべてのものは、またはが作成されHDCたのと同じスレッドで呼び出す必要があります( 、および同様のものは注目すべき例外です)。s、 sなどはスレッド間で受け渡すことができますが、一度に1つのスレッドで操作する必要があります。HWNDHDCSendMessagePostMessageHBITMAPHICON

他のほとんどの機能(GDIまたはウィンドウ管理を処理しない機能)は、実際にスレッドセーフです。

LoadLibraryこれには、、、およびを含める必要がGetModuleHandleあります。FreeLibraryGetProcAddress

ただし、FreeLibraryDllMainから呼び出すべきではないことに注意してください。

また、これらの関数をマルチスレッド環境でかなり長い間問題なく使用していることも付け加えておきます。

于 2012-06-28T22:56:44.983 に答える