如何控制msvcr90d.dll / msvcp90d.dll的SxS

时间:2013-03-11 10:33:16

标签: visual-studio-2008 dll msvcr90d.dll

经过长时间的研究/研究,我找到了

我的应用程序应该使用msvcr90d.dll / msvcp90d.dll - 9.0.21022.8 但是当我用vs2008调试它时,它总是使用msvcr90d.dll - 9.0.30729.6161

我认为这应该是我的应用程序崩溃STL标准矢量异常(来自第三方DLL)的根本原因。我用vs2008在我的机器上成功运行了应用程序。必须是其他应用程序影响我的应用程序。

我甚至重新安装vs2008(一次又一次),并为我的应用调整Manifest选项,没有任何改变。我和我的应用程序一起崩溃了。 (该应用程序在我准备向我的老板演示之前就崩溃了......)

我的机器上也有vs2010,vs2012。但是应用程序在它们已经存在时曾经有效。在应用程序崩溃之前,我唯一记得的就是使用TeamViewer远程访问我的机器......第二天,邪恶的日子就开始了。

如何为我的应用程序控制SxS?

1 个答案:

答案 0 :(得分:1)

您在清单中要求的DLL版本.21022.8正在通过发布者策略文件重定向,这些文件也部署在并行缓存中。这使您最终获得SP1版本以及多个安全补丁。这是Microsoft可以在运行时DLL中修补安全漏洞的主要机制。

你可以相当确定的一件事是导致你的问题的DLL版本,这个第三方DLL要求的版本将受到相同的版本重定向规则。轻松检查btw,查看Debug + Windows + Modules窗口并查找msvcr90d.dll。你会看到是否有多个已加载,你可以看到版本号。并注意msvcr90.dll,Release版本,将它们加载到一个进程中真的很糟糕。当您链接到DLL的Release版本时可能会发生。

一个标准的崩溃诱导不匹配是_HAS_ITERATOR_DEBUGGING #define。迭代器调试会更改C ++集合类对象的大小。当DLL通过导出的函数公开此类对象并使用此#define的不同设置进行编译时,这会出错。它暴露的对象具有错误的布局。您必须确保使用与第三方编译DLL时使用的设置相同的设置。默认情况下,它针对Debug版本打开,因此将项目的#define设置为0的可能性将是快速修复。如果您不知道或希望他们更改设置,请与供应商联系。也许也是指出在DLL边界上暴露C ++对象的好时机。