我正在编译一个使用多个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?
答案 0 :(得分:0)
这是由并排装配引起的许多令人头疼的问题之一。每当有Visual Studio更新时,您确实需要重新编译所有代码。因为CRT中有版本更改,所以一些代码使用一个DLL,其余代码使用另一个DLL。
此外,在分发时,您确实需要通过合并模块或appropriate installation set分发CRT,而不是将DLL复制到应用程序文件夹中。这将允许程序通过WinSxS查找适当的运行时。
最后,如果您想完全删除问题,就像我一样,您可以将所有项目修改为link statically with the CRT并重新编译所有内容。这将完全消除对运行时DLL的依赖 - 至少,使用您自己的代码。在这里不再担心WinSxS。