经过长时间的学习/研究,我发现
我的应用程序应该使用msvcr90d.dll/msvcp90d.dll -- 9.0.21022.8,但是当我使用vs2008调试它时,它总是使用msvcr90d.dll -- 9.0.30729.6161
我认为这应该是我的应用程序崩溃的根本原因,因为STL标准向量异常(来自第三方DLL)。我曾经用vs2008在我的机器上成功运行过这个应用程序。一定是其他应用影响了我的应用。
我甚至重新安装了vs2008 (一次又一次),并调整了我的应用程序的清单选项,但没有什么变化。我用我的应用程序在crashed...along上。(就在我准备向我的老板演示它之前,应用程序崩溃了…)
我的机器上也有vs2010和vs2012。但是,当它们已经存在的时候,这个应用程序就可以工作了。在应用崩溃之前,我唯一记得的事情就是我用TeamViewer远程访问我的机器……第二天,邪恶的日子开始了。
如何控制我的应用程序的SxS?
发布于 2013-03-11 21:27:39
您在清单中请求的DLL版本.21022.8将通过也部署在并行缓存中的发行者策略文件进行重定向。这使得你最终得到了SP1版本加上几个安全补丁。这是Microsoft修补运行时DLL中的安全漏洞的主要机制。
有一件事你可以相当确定的是,是而不是的DLL版本导致了你的问题,这个第三方DLL请求的版本将受到相同的版本重定向规则的约束。很容易检查btw,在调试+窗口+模块窗口中查找msvcr90d.dll。您将看到是否有多个被加载,并且您可以看到版本号。注意msvcr90.dll的发布版本,将它们都加载到一个进程中是非常糟糕的。当您链接到DLL的发布版本时,可能会发生这种情况。
一个标准的导致崩溃的不匹配是_HAS_ITERATOR_DEBUGGING #define。迭代器调试更改C++集合类对象的大小。当DLL通过导出函数公开此类对象,并使用此#define的不同设置进行编译时,会出现此错误。它公开的对象具有错误的布局。您必须确保您使用的设置与第三方编译DLL时使用的设置相同。对于Debug构建,它是默认打开的,因此将项目的#define设置为0可能是一种快速修复方法。如果您不知道或希望供应商更改其设置,请与他们联系。也许这也是一个很好的时机来指出,跨DLL边界公开C++对象不是一个好主意。
https://stackoverflow.com/questions/15336378
复制相似问题