Microsoft Redistributable包

时间:2010-03-18 14:11:30

标签: visual-studio redistributable

我正在开发一个使用2个库的软件。 这两个库都使用VS2005,都需要VS2005 redist包。 但是,他们的redist包是不同的版本。 所以,我有几个关于安装redists的问题。

1)我可以毫无问题地安装新版本吗? 2)如果我安装这两个redists,Windows如何知道哪个库正在使用哪个redist?

由于

1 个答案:

答案 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以获取有关并行缓存以及如何使用清单文件的信息。