2011-09-06 47 views
0

我编写的程序(使用C#)通过C++/CLI包装库访问我也写过的本地(C++)库。Windows DLL在同一个应用程序中意外加载了不止一次

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

鉴于我的代码没有使用LoadLibrary等函数,并且使用了包括库的.h文件和.lib在内的dll,为什么它会多次初始化,我该怎么做才能避免它?

+0

发布堆栈跟踪。 –

回答

1

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

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

我相信你有下列之一:

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

通过“调试器认为多个内存位置连接到一些库调用”我引用了一个奇怪的事实,我观察到:使用Visual Studio的系统来移动执行光标(该功能允许您选择一个程序行来执行下一个)我注意到,当在一些函数调用上移动光标时,Visual Studio要求我指定我应该移到哪个版本的同一个函数,给出一个包含不同地址的库的三个副本的列表。函数本身不会以任何方式重载或变形。 –

+0

@火星上的咖啡:哦,我明白了。如果你100%确定它不是一个模板函数或者什么的,那么我相信它可能是一次加载的多个DLL版本。 – valdo

+0

我终于设法再次处理这个问题,看起来多个调用是由于线程/进程附加。这些问题显然是由于多个调用线程。 –

1

DLL的入口点在第一次加载到进程时以及进程中的任何线程启动或停止时被调用。

如果这是导致您的DLLMain中的问题,那么您需要check the reason for DLL entry并适当处理。

相关问题