最近的Visual Studio 2005安全更新可能会给我们带来问题。
我们构建并内部分发用C ++编写的SDK。这些SDK仅是头文件和静态库的集合。安装安全更新后,我们的SDK现在依赖于较新版本的MSVC CRT DLL。这些SDK在生成EXE文件的项目的下游使用。
如果其中一个EXE文件是使用混合的SDK构建的(一些来自安全更新之前,一些来自之后),那么生成的EXE文件会引用两组MSVC运行时DLL。 E.g:
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.4053" processorArchitecture="amd64" publicKeyToken="1fc8b3b9a1e18e3b">
</assemblyIdentity>
</dependentAssembly>
</dependency>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.762" processorArchitecture="amd64" publicKeyToken="1fc8b3b9a1e18e3b">
</assemblyIdentity>
</dependentAssembly>
</dependency>
</assembly>
这是否意味着在运行时此EXE将使用两个版本的DLL?这是否意味着我们必须使用此EXE分发两个版本的MSVC运行时DLL?
是否有一种简单的方法可以避免此问题而不强制使用Visual Studio 2005安全补丁构建所有SDK? (对于我们不希望不必要地重建的一些较旧且相当稳定的SDK,这是不合需要的)
是否可以简单地重写SDK或最终EXE文件上的清单文件,以便只提到一个版本的MSVC CRT DLL?
我的理解是相关更新如下:
Microsoft Visual Studio 2005 Service Pack 1的安全更新:KB971090
http://go.microsoft.com/fwlink/?LinkId=155934
Microsoft Visual Studio 2008 Service Pack 1的安全更新:KB971092
http://go.microsoft.com/fwlink/?LinkID=155933
我发现了另外两个相似的问题:
VC++: KB971090 and selecting Visual C Runtime DLL dependencies
答案 0 :(得分:2)
1)是的,这意味着运行时正在使用这两个版本 - 这是您永远不想要的。它应该只引用DLL的单个版本
2)我开发了一种方法来强制版本为SP1版本(没有安全更新)。我概述了它here
3)您可以完全禁用清单并手动执行,但我不建议这样做,因为为调试和发布维护不同的清单很麻烦,而且这是一种容易出错的处理问题的方法。最好使用我在上面(2)中提到的解决方法。
答案 1 :(得分:2)
正如Ted所说,在运行时,您的可执行文件将尝试使用这两个版本的DLL。这可能是因为您尚未完全重新编译整个项目(或者您正在使用已编译为依赖于.762运行时的外部库)。
好消息是,如果这两个库都安装在您的客户端系统上,那么并行重定向策略将意味着只加载最新版本。到目前为止,您将注意到的更有害的副作用是当只安装一个(可能是.762)应用程序将无法启动时,旧的“应用程序配置不正确,重新安装可能会解决此问题”错误消息。
这是否意味着我们必须使用此EXE分发两个版本的MSVC运行时DLL?
最简单的解决方案可能是发布可从以下链接获得的最新版本的visual c ++运行时可再发行组件。
http://download.microsoft.com/download/6/B/B/6BB661D6-A8AE-4819-B79F-236472F6070C/vcredist_x86.exe
这可能有点痛苦,因为它要求用户在EULA页面上单击“我同意”并且需要管理员权限,但是如果您可以让用户安装它,那么通过一般共识它是最佳选择。