【问题标题】:Are LoadLibrary, FreeLibrary and GetModuleHandle Win32 functions thread safe?LoadLibrary、FreeLibrary 和 GetModuleHandle Win32 函数是线程安全的吗?
【发布时间】:2012-06-30 12:13:25
【问题描述】:

我正在开发与本机 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 函数时是否有人有类似的经验?

奥斯卡

【问题讨论】:

  • LoadLibrary 和 FreeLibrary 相对于 DLL 加载列表应该是线程安全的,理论上 GetModuleHandle 也应该是线程安全的,但是我可能会使用 LoadLibrary/FreeLibrary 对,而不是使用该方法,因为您确保拥有对库的引用,并且在您使用它时它不能从内存中消失。

标签: c# multithreading winapi


【解决方案1】:

根据 Igor Tandetnik(Microsoft MVP)的说法。

除了不是线程安全的 GDI 函数。几乎所有需要HWND 和/或HDC 的东西都必须在创建HWNDHDC 的同一线程上调用(SendMessagePostMessage 和类似的都是值得注意的例外)。 HBITMAPs、HICONs 等可以在线程之间传递,但一次只能由一个线程操作。

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

这应该包括LoadLibraryGetModuleHandleFreeLibraryGetProcAddress

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 2010-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多