【问题标题】:Windows update breaks dlls?Windows 更新会破坏 dll?
【发布时间】:2011-08-06 15:41:45
【问题描述】:

我正在编译一个使用多个 DLL 并使用 VS2008 编译的项目。最近在我的计算机上编译的 Windows 更新 DLL 在其他计算机上停止工作后。

经过一番调查,结果发现它将我正在编译的 CRT 可再发行库从版本“9.0.21022.8”更新到版本“9.0.30729.4148”

这从我正在编译的 EXE 的清单文件中很明显。它包含以下内容:

  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.21022.8" processorArchitecture="amd64" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>
  </dependency>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.30729.4148" processorArchitecture="amd64" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>
  </dependency>

意味着它想同时使用两个不同版本的 CRT。 我现在正在编译的代码需要第二个版本,而几周前编译的旧 dll 需要第一个版本。

在部署应用程序的计算机中,这成为一个问题,因为它们从名为 Microsoft.VC90.CRT 的本地文件夹而不是 WinSXS 获取 CRT dll。 此文件夹不能包含两个不同版本的 dll。

是否有解决此问题的已知解决方案,或者我是否需要开始使用新 CRT 编译所有其他 DLL?

【问题讨论】:

  • 我想我上周注意到了完全相同的问题。在 Windows 更新后,前一天构建良好的项目不再构建。事实上,它导致了 VS2008 编译器中的 ICE 崩溃。重建都解决了这个问题。我从来没有确定确切的原因,但这对我来说没什么大不了的,因为我们还没有发货。

标签: visual-studio-2008 manifest crt winsxs


【解决方案1】:

这是由并行程序集引起的众多令人头疼的问题之一。每当有 Visual Studio 更新时,您确实需要重新编译所有代码。因为 CRT 中的版本发生了变化,所以您的一些代码使用了一个 DLL,而其余的则使用了另一个。

此外,在分发时,您确实需要通过合并模块或appropriate installation set 分发 CRT,而不是将 DLL 复制到应用程序文件夹中。这将允许程序通过 WinSxS 查找适当的运行时。

最后,如果您想像我一样完全消除问题,您可以将所有项目修改为link statically with the CRT 并重新编译所有内容。这将完全消除对运行时 DLL 的依赖——至少,使用您自己的代码。无需再担心 WinSxS。

【讨论】:

    猜你喜欢
    • 2018-01-04
    • 1970-01-01
    • 1970-01-01
    • 2017-09-06
    • 1970-01-01
    • 1970-01-01
    • 2019-01-22
    • 2015-09-21
    • 2019-11-30
    相关资源
    最近更新 更多