0

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

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

谢谢

4

1 回答 1

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

于 2010-03-18T17:43:43.740 回答