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 函数。几乎所有需要 anHWND和/或 an 的东西都HDC必须在创建HWNDor的同一线程上调用(和类似的都是值得注意的例外)。s、 s 等可以在线程之间传递,但一次只能由一个线程操作。HDCSendMessagePostMessageHBITMAPHICON

大多数其他函数——那些不处理 GDI 或窗口管理的函数——确实是线程安全的。

这应该包括LoadLibraryGetModuleHandleFreeLibraryGetProcAddress

但是请记住,FreeLibrary不应从 DllMain 调用它。

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

于 2012-06-28T22:56:44.983 回答