重定向程序集版本
注意
本文特定于 .NET Framework。 它不适用于 .NET 的较新版本实现,包括 .NET 6 及更高版本。
你可以将编译时绑定引用重定向到 .NET Framework 程序集、第三方程序集或你自己的应用的程序集。 你还可以重定向应用,以通过多种方式使用不同版本的程序集:通过发布服务器策略、通过应用配置文件或通过计算机配置文件。 本文讨论了程序集绑定在 .NET Framework 中的工作原理以及对其进行配置的方式。
提示
本文特定于 .NET Framework 应用。 有关 .NET 5+(和 .NET Core)中的程序集加载的详细信息,请参阅 .NET 中的依赖项加载。
程序集统一和默认绑定
到 .NET Framework 程序集的绑定有时会通过称为 “程序集统一”的过程进行重定向。 .NET Framework 包括一个公共语言运行时版本和构成类型库的约二十个 .NET Framework 程序集。 运行时将这些 .NET Framework 程序集视为单个单元。 默认情况下,当启动应用时,由运行时运行的所有对代码中的类型的引用都将定向到具有与进程中加载的运行时相同的版本号的 .NET Framework 程序集。 此模型发生的重定向是运行时的默认行为。
例如,如果你的应用引用 System.XML 命名空间中的类型并使用 .NET Framework 4.5 生成,则它包含对 System.XML 程序集(随附运行时版本 4.5)的静态引用。 如果想要重定向绑定引用,以指向 System.XML 程序集(随附 .NET Framework 4),你可以将重定向信息放在应用配置文件中。 统一的 .NET Framework 程序集的配置文件中的绑定重定向将取消该程序集的统一。
此外,如果有多个可用版本,可能需要手动重定向第三方程序集的程序集绑定。
使用发布者策略重定向版本
程序集的供应商可以通过包括发布服务器策略文件与新的程序集,将应用定向到较新版本的程序集。 位于全局程序集缓存中的发布服务器策略文件包含程序集重定向设置。
每个 主要、次要 版本的程序集都具有其自己的发布服务器策略文件。 例如,从版本 2.0.2.222 到 2.0.3.000 和从版本 2.0.2.321 到版本 2.0.3.000 的重定向都转到同一文件中,因为它们与版本 2.0 相关联。 但是,从版本 3.0.0.999 到版本 4.0.0.000 的重定向则转入版本 3.0.999 的文件。 每个主要版本的 .NET Framework 都具有其自己的发布服务器策略文件。
如果存在某一程序集的发布服务器策略文件,则在检查过该程序集的清单和应用配置文件后,运行时将检查该文件。 仅当新的程序集与被重定向的程序集向后兼容时,供应商才会使用发布服务器策略文件。
你通过在应用配置文件指定设置,跳过应用的发布服务器策略,如 跳过发布者策略部分中所述。
在应用级别重定向版本
通过应用配置文件,有几种不同的技术来更改你的应用绑定行为:你可以手动编辑该文件、可以依赖于自动绑定重定向或可以通过跳过发布服务器策略指定绑定行为。
手动编辑应用配置文件
你可以手动编辑应用配置文件,解决程序集问题。 例如,供应商可能会发布你的应用使用的较新版本的程序集,而没有提供发布服务器策略,因为他们不保证向后兼容性,你可以通过将程序集绑定信息放置在如下所示的应用配置文件中,定向你的应用,以使用较新的程序集版本。
<dependentAssembly>
<assemblyIdentity name="someAssembly"
publicKeyToken="32ab4ba45e0a69a1"
culture="en-us" />
<bindingRedirect oldVersion="7.0.0.0" newVersion="8.0.0.0" />
</dependentAssembly>
依赖于自动绑定重定向
在面向 .NET Framework 4.5.1 或更高版本的 Visual Studio 中创建桌面应用时,该应用使用自动绑定重定向。 这意味着如果两个组件引用同一强名称程序集的不同版本,则运行时会自动添加绑定重定向到输出应用配置 (app.config) 文件中的程序集的较新版本。 此重定向将重写可能会发生的程序集统一。 不修改源 app.config 文件。 例如,假设你的应用直接引用带外 .NET Framework 组件,但使用面向同一组件的较旧版本的第三方库。 在编译该应用时,将修改输出应用配置文件以包含绑定重定向到较新版本的组件。 如果创建一个 Web 应用,你将收到有关绑定冲突的生成警告,这反过来将为你提供将必要的绑定重定向添加到源 Web 配置文件的选项。
如果你在编译时手动添加绑定重定向到源 app.config 文件,则 Visual Studio 将基于你添加的绑定重定向尝试统一程序集。 例如,假设你对某一程序集插入以下绑定重定向:
<bindingRedirect oldVersion="3.0.0.0" newVersion="2.0.0.0" />
如果你的应用中的另一个项目引用了同一程序集的版本 1.0.0.0,则自动绑定重定向将添加以下条目到输出 app.config 文件,以便该应用在此程序集的版本 2.0.0.0 上统一:
<bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0" />
如果你的应用面向 .NET framework 的较旧版本,则可以启用自动绑定重定向。 可以通过提供任何程序集的 app.config 文件中的绑定重定向信息,重写此默认行为或关闭绑定重定向功能。 若要了解如何打开或关闭此功能,请参阅如何:启用和禁用自动绑定重定向。
绕过发布者策略
如有必要,你可以在应用配置文件中重写发布服务器策略。 例如,声称向后兼容的程序集的新版本也会中断应用。 如果想要跳过发布服务器策略,添加一个 <publisherPolicy> 元素到应用配置文件中的 <dependentAssembly> 元素,并将“应用”属性设置为“否”,这将重写之前任何为“是”的设置。
<publisherPolicy apply="no" />
跳过发布服务器策略来保持应用为你的用户运行,但要确保将问题报告给程序集供应商。 如果程序集具有发布服务器策略文件,则供应商应确保该程序集向后兼容并且该客户端可以尽可能多的使用新版本。
在计算机级别重定向版本
可能存在极少数情况,当计算机管理员想要计算机上所有的应用都使用程序集的某一特定版本时。 例如,特定版本可能会修复安全漏洞。 如果某个程序集在计算机配置文件(称为“machine.config”)中进行重定向,则该计算机上的所有使用旧版本的应用都将被定向为使用新版本。 计算机配置文件将重写应用配置文件和发布服务器策略文件。 对于 32 位计算机,此 machine.config 文件位于 %windir%\Microsoft.NET\Framework[version]\config\machine.config,对于 64 位计算机,位于 %windir%\Microsoft.NET\Framework64[version]\config\machine.config。
在配置文件中指定程序集绑定
使用相同的 XML 格式指定绑定重定向,无论它位于应用配置文件、计算机配置文件还是位于发布服务器策略文件中。 若要将一个程序集版本重定向到另一个版本,可使用 <bindingRedirect> 元素。 oldVersion 特性可以指定单个程序集版本或一系列版本。 newVersion
特性将指定单个版本。 例如, <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
指定了一个单一绑定重定向。 该示例还指定发布服务器策略文件不会代替 myThirdAssembly
的绑定重定向。
若要绑定程序集,必须指定带 <assemblyBinding> 标记中的 xmlns 属性的字符串“urn:schemas-microsoft-com:asm.v1”。
<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 app,
publisher policy, or machine configuration files. -->
<bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="3.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="mySecondAssembly"
publicKeyToken="32ab4ba45e0a69a1"
culture="en-us" />
<bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="myThirdAssembly"
publicKeyToken="32ab4ba45e0a69a1"
culture="en-us" />
<!-- Publisher policy can be set only in the app
configuration file. -->
<publisherPolicy apply="no" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
限制到特定版本的程序集绑定
可以使用应用配置文件中 <assemblyBinding> 元素上的 appliesTo 特性,将程序集绑定引用重定向到 .NET Framework 的特定版本。 此可选特性用 .NET Framework 版本号来指示其适用的版本。 如果没有指定 appliesTo 特性,<assemblyBinding> 元素将适用于 .NET Framework 的所有版本。
例如,若要重定向 .NET Framework 3.5 程序集的程序集绑定,应在你的应用配置文件中包括以下 XML 代码。
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"
appliesTo="v3.5">
<dependentAssembly>
<!-- assembly information goes here -->
</dependentAssembly>
</assemblyBinding>
</runtime>
应按版本顺序输入重定向信息。 例如,先输入 .NET Framework 3.5 程序集的程序集绑定重定向信息,再输入 .NET Framework 4.5 程序集的绑定重定向信息。 最后,输入任何因不使用 appliesTo 特性而适用于所有版本的 .NET Framework 的.NET Framework 程序集重定向的程序集绑定重定向信息。 如果发生重定向冲突,请使用配置文件中的第一个匹配的重定向语句。
例如,若要将一个引用重定向到 .NET Framework 3.5 程序集,而将另一个引用重定向到 .NET Framework 4 程序集,则使用以下伪代码中所示的模式。
<assemblyBinding xmlns="..." appliesTo="v3.5 ">
<!--.NET Framework version 3.5 redirects here -->
</assemblyBinding>
<assemblyBinding xmlns="..." appliesTo="v4.0.30319">
<!--.NET Framework version 4.0 redirects here -->
</assemblyBinding>
<assemblyBinding xmlns="...">
<!-- redirects meant for all versions of the runtime -->
</assemblyBinding>