Windows更新打破了dll?

时间:2010-04-22 15:12:38

标签: visual-studio-2008 manifest crt winsxs

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

1 个答案:

答案 0 :(得分:0)

这是由并排装配引起的许多令人头疼的问题之一。每当有Visual Studio更新时,您确实需要重新编译所有代码。因为CRT中有版本更改,所以一些代码使用一个DLL,其余代码使用另一个DLL。

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

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