【问题标题】:Visual Studio 2005 security updates and CRT DLL versions in manifest清单中的 Visual Studio 2005 安全更新和 CRT DLL 版本
【发布时间】:2010-11-18 22:39:07
【问题描述】:

最近的 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>

这是否意味着在运行时这个 EXE 将使用两个版本的 DLL?这是否意味着我们必须使用此 EXE 分发两个版本的 MSVC 运行时 DLL?

是否有一种简单的方法可以避免此问题,而无需强制所有 SDK 都使用适当的 Visual Studio 2005 安全补丁来构建? (这对于我们不想不必要地重建的一些较旧且相当稳定的 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

Does the latest Visual Studio 2005 Security Update cause C runtime library issues when hot fixing customer sites

【问题讨论】:

  • 为什么要转移到社区维基?

标签: security dll version visual-c++ manifest


【解决方案1】:

正如 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 页面上单击“我同意”,并且需要管理员权限,但普遍认为,如果您可以让用户安装它,这是最好的选择。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-19
      • 1970-01-01
      • 1970-01-01
      • 2010-12-26
      • 1970-01-01
      • 1970-01-01
      • 2011-01-21
      • 2015-01-04
      相关资源
      最近更新 更多