我正在开发一个与本机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函数时有任何类似的经验?
的奥斯卡
答案 0 :(得分:6)
根据Igor Tandetnik(微软MVP)。
除了不是线程安全的GDI函数。几乎任何需要HWND
和/或HDC
的内容都必须在创建HWND
或HDC
的同一个线程上调用(SendMessage
,{{ 1}}和类似的是值得注意的例外)。 PostMessage
s,HBITMAP
s等可以在线程之间传递,但应该一次由一个线程操作。
大多数其他功能 - 那些不处理GDI或窗口管理的功能 - 确实是线程安全的。
这应包括HICON
,LoadLibrary
,GetModuleHandle
和FreeLibrary
。
请注意,不应该从DllMain 调用 GetProcAddress
。
我还可以补充说,我已经在多线程环境中使用这些功能已经有一段时间没有问题了。