首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何控制msvcr90d.dll/msvcp90d.dll的SxS

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

Stack Overflow用户
提问于 2013-03-11 18:33:16
回答 1查看 360关注 0票数 0

经过长时间的学习/研究,我发现

我的应用程序应该使用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?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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++对象不是一个好主意。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15336378

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档