LoadLibrary,FreeLibrary和GetModuleHandle Win32函数是否安全?

osc*_*kuo 10 c# winapi multithreading

我正在开发一个与本机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); 
}
Run Code Online (Sandbox Code Playgroud)

我注意到w3wp.exe进程在重负载下突然崩溃,当我尝试调试它时,调试器经常在我的NativeMethods.GetModuleHandle()函数调用中停止.

我找不到任何GetModuleHandle不是线程安全的证据所以我想知道有没有人在从多线程.NET应用程序中交换这些kernel32.dll函数时有任何类似的经验?

奥斯卡

Eri*_*tis 6

根据Igor Tandetnik(微软MVP).

除了不是线程安全的GDI函数.几乎所有的东西,它接受一个HWND和/或HDC必须在该同一线程上调用HWNDHDC创建(SendMessage,PostMessage以及类似的一些值得注意的例外).HBITMAPs, HICONs等可以在线程之间传递,但是应该一次由一个线程操纵.

大多数其他功能 - 那些不处理GDI或窗口管理的功能 - 确实是线程安全的.

这应该包括LoadLibrary,GetModuleHandle,FreeLibraryGetProcAddress.

请记住,FreeLibrary不应该从DllMain调用.

我还可以补充说,我已经在多线程环境中使用这些函数已经有一段时间没有问题了.