2

我正在编译一个使用多个 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?

4

1 回答 1

0

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

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

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

于 2011-08-06T07:41:45.863 回答