0

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

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

我认为这应该是我的应用程序因 STL 标准向量异常(来自第 3 方 DLL)而崩溃的根本原因。我曾经使用 vs2008 在我的机器上成功运行过该应用程序。一定是其他应用影响了我的应用。

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

我的机器上也有 vs2010、vs2012。但是,当它们已经存在时,该应用程序就可以正常工作。在应用程序崩溃之前,我唯一记得的就是我使用 TeamViewer 远程访问我的机器……第二天,邪恶的日子开始了。

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

4

1 回答 1

1

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

您可以相当确定的一件事是,它不是导致您的问题的 DLL 版本,这个第 3 方 DLL 要求的版本将受到相同的版本重定向规则的约束。顺便说一句,易于检查,查看 Debug + Windows + Modules 窗口并查找 msvcr90d.dll。您将查看是否加载了多个,并且可以看到版本号。并注意发布版本的 msvcr90.dll,将它们都加载到进程中是非常糟糕的。当您链接到 DLL 的发布版本时可能会发生这种情况。

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

于 2013-03-11T13:27:39.380 回答