gpt4 book ai didi

c# - LoadLibrary、FreeLibrary 和 GetModuleHandle Win32 函数线程安全吗?

转载 作者:可可西里 更新时间:2023-11-01 09:12:00 25 4
gpt4 key购买 nike

我正在开发一个与 native 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 函数时,是否有人有过类似的经历?

奥斯卡

最佳答案

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

除了非线程安全的 GDI 函数。几乎任何需要 HWND 和/或 HDC 的东西都必须在 HWNDHDC 所在的同一线程上调用> 已创建(SendMessagePostMessage 和类似的是值得注意的异常(exception))。 HBITMAPHICON 等可以在线程之间传递,但一次应该由一个线程操作。

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

这应该包括 LoadLibraryGetModuleHandleFreeLibraryGetProcAddress

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

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

关于c# - LoadLibrary、FreeLibrary 和 GetModuleHandle Win32 函数线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11253725/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com