加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – LoadLibrary,FreeLibrary和GetModuleHandle Win32功能线程

发布时间:2020-12-15 17:36:51 所属栏目:百科 来源:网络整理
导读:我正在使用与本机DLL交互的Web服务,我使用LoadLibrary / GetModuleHandle / FreeLIbrary和GetProcAddress来动态加载/卸载DLL,因为它不是很稳定. public class NativeMethods{ [DllImport("kernel32.dll",CharSet = CharSet.Auto,SetLastError = true)] publi
我正在使用与本机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",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(微软MVP).

除了不是线程安全的GDI函数.几乎任何需要HWND和/或HDC的东西必须在创建HWND或HDC的同一线程上被调用(SendMessage,PostMessage和类似的值是值得注意的例外). HBITMAP,HICON等等可以在线程之间传递,但一次应该由一个线程操纵.

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

这应该包括LoadLibrary,GetModuleHandle,FreeLibrary和GetProcAddress.

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读