Windows DLL在同一个应用程序中意外加载了多次

时间:2011-09-06 20:08:03

标签: windows dll c++-cli

我编写的程序(在C#中)通过C ++ / CLI包装器库访问我也写过的本机(c ++)库。

我注意到本机库的DllMain方法被多次调用,调试器认为多个内存位置连接到某些库调用。从我看到的,库被初始化(和内存分配)不止一次。

鉴于我的代码不使用LoadLibrary等函数,并且使用了包含库的.h文件和.lib的dll,为什么它不止一次初始化,我该怎么做才能避免它?

2 个答案:

答案 0 :(得分:1)

当DLL首次加载到进程中时,以及进程中的任何线程启动或停止时,都会调用DLL的入口点。

如果这导致您的DLLMain出现问题,那么您需要check the reason for DLL entry并正确处理。

答案 1 :(得分:1)

AFAIK DLL可能不会多次加载到同一地址空间。即使你明确地调用LoadLibrary,DLL也不会被多次加载,而是它的引用计数器会递增。

另外,我不明白你的意思是“调试器认为多个内存位置连接到某些库调用”。在DLL绑定期间,单个导入的符号(函数或变量地址)仅由一个地址填充。

我相信您有以下其中一项:

  • 您可以同时加载同一个库的多个版本(多个DLL文件)。典型的错误是同时加载调试和释放DLL版本。
  • 您的DllMain被多次调用,但这并不意味着它被加载了好几次。你检查提供给DllMain的参数吗?它是DLL_PROCESS_ATTACH,还是只是DLL_THREAD_ATTACH/DLL_THREAD_DETACH