清单中的Visual Studio 2005安全更新和CRT DLL版本

pau*_*doo 6 security dll version manifest visual-c++

最近的Visual Studio 2005安全更新可能会给我们带来问题.

我们构建并内部分发用C++编写的SDK.这些SDK仅是头文件和静态库的集合.安装安全更新后,我们的SDK现在依赖于较新版本的MSVC CRT DLL.这些SDK在生成EXE文件的项目的下游使用.

如果其中一个EXE文件是使用混合SDK构建的(一些来自安全更新之前,一些来自之后),那么生成的EXE文件会引用两组MSVC运行时DLL.例如:

<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>
Run Code Online (Sandbox Code Playgroud)

这是否意味着在运行时这个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并选择Visual C运行时DLL依赖项

热修复客户站点时,最新的Visual Studio 2005安全更新是否会导致C运行时库问题

Ted*_*ed. 2

1)是的,这意味着运行时正在使用两个版本 - 这是您永远不希望发生的事情。它应该只引用 DLL 的单个版本

2)我开发了一种方法来强制版本为SP1版本(没有安全更新)。我已经在这里概述了

3)您可以完全禁用清单并手动执行它们,但我不建议这样做,因为为调试和发布维护不同的清单很痛苦,而且这是一种容易出错的处理问题的方法。最好使用我在上面(2)中提到的解决方法。