重定向程序集版本
更新:2007 年 11 月
针对特定版本的具有强名称的程序集生成 .NET Framework 应用程序时,该应用程序在运行时使用该版本的程序集。但是,有时可能想要应用程序针对较新版本的程序集运行。应用程序配置文件、计算机配置文件或发行者策略文件可以将一个版本的程序集重定向到另一个版本。有关公共语言运行库如何使用这些文件来确定要使用哪一程序集版本的详细信息,请参见运行库如何定位程序集。可以使用 .NET Framework 配置工具 (Mscorcfg.msc) 来重定向应用程序级和计算机级的程序集版本,或者可以直接编辑配置文件。
说明: |
---|
不能重定向不具有强名称的程序集的版本。公共语言运行库忽略不具有强名称的程序集的版本。 |
使用发行者策略重定向程序集版本
程序集的供应商会通过将发行者策略文件与升级的程序集包括在一起,声明应用程序应使用较新版本的程序集。发行者策略文件位于全局程序集缓存中,它包含程序集重定向设置。
程序集的每个 major.minor 版本都有其自己的发行者策略文件。例如,从版本 1.1.2.222 重定向到版本 1.1.3.000 和从版本 1.1.2.321 重定向到版本 1.1.3.000 都会进入相同的文件。但是,从版本 2.0.0.999 重定向到版本 3.0.0.000 就会进入不同的文件。
如果发行者策略文件存在,那么在检查程序集的清单和应用程序配置文件之后,运行库就会检查该文件。只有在新程序集与正在被重定向的程序集向后兼容时,供应商才能使用发行者策略。
可以通过在应用程序配置文件中指定设置,来跳过发行者策略。
跳过发行者策略
即使是自称向后兼容的新版本程序集,也会中断应用程序。在发生这种情况时,可以在应用程序配置文件中使用下列设置,以使运行库跳过发行者策略:
<publisherPolicy apply="no" />
跳过发行者策略,以便使应用程序对用户保持正常运行,但要确保向程序集的供应商报告该问题。一旦程序集有发行者策略,供应商应确保程序集能够向后兼容,并且确保客户端可以尽可能地多使用新版本。
在应用程序级重定向程序集版本
假设程序集的供应商发布了一个程序集新版本供您的应用程序使用,但不提供发行者策略,因为该供应商不要保证新程序集与原始版本向后兼容。可以在应用程序的配置文件中放置程序集绑定信息,来指定您的应用程序使用新版本程序集。
在计算机级重定向程序集版本
可能有一些不常见的情况,即,计算机管理员希望计算机上的所有应用程序都使用特定版本的程序集。例如,您可能希望每个应用程序都使用特定的程序集版本,因为它能堵住安全漏洞。如果程序集在计算机的配置文件中重定向,那么使用旧版本的所有应用程序都将使用新版本。计算机配置文件会重写应用程序配置文件和发行者策略。
在配置文件中指定程序集绑定
应用程序配置文件、计算机配置文件和发行者策略文件都使用相同的 XML 架构来处理程序集重定向。
程序集绑定
为程序集指定信息的方法是将每个程序集的信息放在 <dependentAssembly> 元素内。<assemblyIdentity> 元素包含标识程序集的信息。在配置文件中可以有多个 <dependentAssembly> 元素,但在每个 <dependentAssembly> 元素内必须正好有一个 <assemblyIdentity> 元素。
若要绑定程序集,必须在 <assemblyBinding> 标记中用 xmlns 属性指定字符串“urn:schemas-microsoft-com:asm.v1”。
指定发行者策略
若要使运行库跳过特定程序集的发行者策略,请将 <publisherPolicy> 元素置于 <dependentAssembly> 元素内。若要使运行库跳过应用程序使用的所有程序集的发行者策略,请将该设置置于 <assemblyBinding> 元素内。还可以使用 .NET Framework 配置工具 (Mscorcfg.msc) 来跳过发行者策略。
apply 属性的默认设置为 yes。将 apply 属性设置为 no 会重写任何以前的 yes 设置。例如,如果 apply 在应用程序级设置为 no,那么将忽略任何程序集特定的 apply 设置,即使它声明该值为 yes,也是如此。因此,no 设置是唯一的有用状态,因为该值更改默认值。
重定向程序集版本
若要将一个版本重定向到另一个版本,请使用 <bindingRedirect> 元素。oldVersion 属性可以指定单个版本,也可以指定多个版本范围。例如,<bindingRedirect oldVersion="1.1.0.0-1.2.0.0" newVersion="2.0.0.0"/> 指定运行库应使用版本 2.0.0.0 代替 1.1.0.0 和 1.2.0.0 之间的程序集版本。
示例
下面的示例说明如何将 myAssembly 的一个版本重定向到另一个版本,并对 mySecondAssembly 关闭发行者策略。
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="myAssembly"
publicKeyToken="32ab4ba45e0a69a1"
culture="en-us" />
<!-- Assembly versions can be redirected in application,
publisher policy, or machine configuration files. -->
<bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="mySecondAssembly"
publicKeyToken="32ab4ba45e0a69a1"
culture="en-us" />
<!-- Publisher policy can be set only in the application
configuration file. -->
<publisherPolicy apply="no" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
重定向 .NET Framework 程序集绑定
您可以在应用程序配置文件中使用 <assemblyBinding> 元素的 appliesTo 属性,将程序集绑定引用重定向到特定的 .NET Framework 版本。此可选属性使用 .NET Framework 版本号指示其适用的版本。如果没有指定 appliesTo 属性,<assemblyBinding> 元素将适用于 .NET Framework 的所有版本。
appliesTo 属性是在 .NET Framework 1.1 版中引入的;.NET Framework 1.0 版将忽略该属性。这意味着,即使指定了 appliesTo 属性,在使用 .NET Framework 1.0 版时所有的 <assemblyBinding> 元素也都适用。
例如,若要重定向 .NET Framework 1.0 版程序集 Regcode 的程序集绑定,必须在应用程序配置文件中包含下面这段 XML 代码。
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"
appliesTo="v1.0.3705">
<dependentAssembly>
<!-- assembly information goes here -->
</dependentAssembly>
</assemblyBinding>
</runtime>
<assemblyBinding> 元素是区分顺序的。首先应为任何 .NET Framework 1.0 版程序集输入程序集绑定重定向信息,然后为任何 .NET Framework 1.1 版程序集输入程序集绑定重定向信息。最后,为任何因不使用 appliesTo 属性而适用于所有 .NET Framework 版本的 .NET Framework 程序集重定向输入程序集绑定重定向信息。当重定向中有冲突时,将使用配置文件中第一个匹配的重定向语句。
例如,要将一个引用重定向到 .NET Framework 1.0 版程序集,并将另一个引用重定向到 .NET Framework 1.1 版程序集,可以使用以下伪代码中的模式。
<assemblyBinding xmlns="..." appliesTo="v1.0.3705">
<!—.NET Framework version 1.0 redirects here -->
</assemblyBinding>
<assemblyBinding xmlns="..." appliesTo="v1.1.5000">
<!—.NET Framework version 1.1 redirects here -->
</assemblyBinding>
<assemblyBinding xmlns="...">
<!-- redirects meant for all versions of the runtime -->
</assemblyBinding>