我编写的程序(在C#中)通过C ++ / CLI包装器库访问我也写过的本机(c ++)库。
我注意到本机库的DllMain方法被多次调用,调试器认为多个内存位置连接到某些库调用。从我看到的,库被初始化(和内存分配)不止一次。
鉴于我的代码不使用LoadLibrary等函数,并且使用了包含库的.h文件和.lib的dll,为什么它不止一次初始化,我该怎么做才能避免它?
答案 0 :(得分:1)
当DLL首次加载到进程中时,以及进程中的任何线程启动或停止时,都会调用DLL的入口点。
如果这导致您的DLLMain出现问题,那么您需要check the reason for DLL entry并正确处理。
答案 1 :(得分:1)
AFAIK DLL可能不会多次加载到同一地址空间。即使你明确地调用LoadLibrary
,DLL也不会被多次加载,而是它的引用计数器会递增。
另外,我不明白你的意思是“调试器认为多个内存位置连接到某些库调用”。在DLL绑定期间,单个导入的符号(函数或变量地址)仅由一个地址填充。
我相信您有以下其中一项:
DllMain
被多次调用,但这并不意味着它被加载了好几次。你检查提供给DllMain
的参数吗?它是DLL_PROCESS_ATTACH
,还是只是DLL_THREAD_ATTACH/DLL_THREAD_DETACH
?