我正在开发一个使用2个库的软件。 这两个库都使用VS2005,都需要VS2005 redist包。 但是,他们的redist包是不同的版本。 所以,我有几个关于安装redists的问题。
1)我可以毫无问题地安装新版本吗? 2)如果我安装这两个redists,Windows如何知道哪个库正在使用哪个redist?
由于
答案 0 :(得分:3)
从XP开始,DLL是(或可以)安装在Windows并排缓存中(实际上,VS2005 DLL坚持在并行缓存中找到;否则它们拒绝运行)。
在Windows并排缓存(可以在C:\ WINDOWS \ WINSxS中找到)中,DLL放在子文件夹中,由名称和版本标识。这样,DLL的多个版本可以并排安装。
如果编译Visual Studio应用程序,编译器将告诉链接器它应该生成清单文件。然后可以使用MT命令在可执行文件或DLL中链接此清单文件。
此清单文件包含与前面描述的版本号相同的版本号,Windows将使用此信息来定位加载可执行文件或DLL时要加载的DLL。
在您的问题中,您使用的2个库是DLL还是LIB尚不清楚。 如果它们是DLL,则使用上述系统,您可能没有任何问题。 您仍然可以尝试安装较新的版本,但如果Windows抱怨安装旧版本也是安全的。
但是,如果您使用的是LIB,则可能会遇到麻烦。无法指示每个LIB使用的DLL。您的可执行文件只能引用一个DLL(实际上是DLL的一个版本),而不是两个。
在这种情况下,您可以执行的操作是检查并行缓存中的策略。您可以在C:\ WINDOWS \ WINSxS \ Policies中找到它。每个组件将有一个子文件夹,文件夹中将包含策略文件。策略文件可以指定重定向,因此,如果您的应用程序需要版本X,则策略可以包含同样允许版本Y的信息。
这是政策文件的一个例子:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!-- Copyright © 1981-2001 Microsoft Corporation -->
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity type="win32-policy" name="policy.8.0.Microsoft.VC80.ATL" version="8.0.50727.4053" processorArchitecture="amd64 " publicKeyToken="1fc8b3b9a1e18e3b"/>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC80.ATL" processorArchitecture="amd64" publicKeyToken="1fc8b3b9a1e18e3b" />
<bindingRedirect oldVersion="8.0.41204.256-8.0.50608.0" newVersion="8.0.50727.4053"/>
<bindingRedirect oldVersion="8.0.50727.42-8.0.50727.4053" newVersion="8.0.50727.4053"/>
</dependentAssembly>
</dependency>
</assembly>
有关更多详细信息,请查看MSDN以获取有关并行缓存以及如何使用清单文件的信息。