.NET Framework 中的并行执行

注释

本文特定于 .NET Framework。 它不适用于 .NET 的较新版本实现,包括 .NET 6 及更高版本。

并行执行是在同一台计算机上运行多个版本的应用程序或组件的功能。 在同一台计算机上,你可以同时拥有多个公共语言运行时版本,以及使用这些运行时版本的多个版本的应用程序和组件。

下图显示了在同一台计算机上使用两个不同版本的运行时的多个应用程序。 应用程序 A、B 和 C 使用运行时版本 1.0,而应用程序 D 使用运行时版本 1.1。

不同运行时版本的并行执行,

.NET Framework 由公共语言运行时和包含 API 类型的程序集集合组成。 运行时和 .NET Framework 程序集分别采用不同的版本。 例如,运行时版本 4.0 实际上是版本 4.0.319,而 .NET Framework 程序集的版本 1.0 为版本 1.0.3300.0。

下图显示了在同一台计算机上使用两个不同版本的组件的应用程序。 应用程序 A 和 B 使用组件的版本 1.0,而应用程序 C 使用同一组件的版本 2.0。

显示组件并列执行的示意图。

并行执行可让你更好地控制应用程序绑定到的组件版本,并更好地控制应用程序使用的运行时版本。

并行执行的优点

在 Windows XP 和 .NET Framework 之前,DLL 冲突发生是因为应用程序无法区分相同代码的不兼容版本。 DLL 中包含的类型信息仅绑定到文件名。 应用程序无法知道 DLL 中包含的类型是否与应用程序生成的类型相同。 因此,新版本的组件可能会覆盖旧版本并中断应用程序。

并行执行和 .NET Framework 提供以下功能来消除 DLL 冲突:

  • 具有强名称的程序集。

    并行执行利用具有强名称的程序集将类型信息绑定到程序集的特定版本。 这样可以防止应用程序或组件绑定到程序集的无效版本。 强名称程序集还允许同一台计算机上存在多个版本的文件,并可供应用程序使用。 有关详细信息,请参阅具有强名称的程序集

  • 版本识别代码存储。

    .NET Framework 在全局程序集缓存中提供版本感知代码存储。 全局程序集缓存是安装了 .NET Framework 的所有计算机上存在的计算机范围的代码缓存。 它根据版本、文化信息和发布者信息存储程序集,并支持组件和应用程序的多个版本。 有关详细信息,请参阅 全局程序集缓存

  • 隔离。

    使用 .NET Framework,可以创建隔离执行的应用程序和组件。 隔离是并行执行的一个重要组成部分。 它涉及到了解正在使用的资源,并在多个版本的应用程序或组件之间自信地共享资源。 隔离还包括以版本特定的方式存储文件。 有关隔离的详细信息,请参阅 “为并行执行创建组件指南”。

版本兼容性

.NET Framework 版本 1.0 和 1.1 旨在相互兼容。 使用 .NET Framework 版本 1.0 生成的应用程序应在版本 1.1 上运行,使用 .NET Framework 版本 1.1 生成的应用程序应在版本 1.0 上运行。 但是,请注意,.NET Framework 版本 1.1 中添加的 API 功能不适用于 .NET Framework 版本 1.0。 使用版本 2.0 创建的应用程序将仅在版本 2.0 上运行。 版本 2.0 应用程序不会在版本 1.1 或更高版本上运行。

.NET Framework 的版本被视为由运行时及其关联的 .NET Framework 程序集(称为程序集统一的概念)组成的单个单元。 你可以重定向程序集绑定以包含其他版本的 .NET Framework 程序集,但重写默认程序集绑定可能会有风险,并且必须在部署之前经过严格测试。

查找运行时版本信息

有关应用程序或组件编译的运行时版本以及应用程序运行所需的运行时版本的信息存储在两个位置。 编译应用程序或组件时,用于编译它的运行时版本的信息存储在托管可执行文件中。 有关应用程序或组件所需的运行时版本的信息存储在应用程序配置文件中。

托管的可执行文件中的运行时版本信息

每个托管应用程序和组件的可移植可执行文件(PE)文件标头包含有关它生成的运行时版本的信息。 公共语言运行时使用此信息来确定应用程序运行所需的最可能运行时版本。

应用程序配置文件中的运行时版本信息

除了 PE 文件标头中的信息外,还可以使用提供运行时版本信息的应用程序配置文件部署应用程序。 应用程序配置文件是基于 XML 的文件,由应用程序开发人员创建,随应用程序一起提供。 启动节的 requiredRuntime< 元素(如果该文件中存在),指定运行时的版本以及应用程序支持的组件版本。><> 还可以在测试中使用此文件测试应用程序与不同版本的运行时的兼容性。

非托管代码(包括 COM 和 COM+ 应用程序)可以具有运行时用于与托管代码交互的应用程序配置文件。 应用程序配置文件会影响通过 COM 激活的任何托管代码。 该文件可以指定它支持的运行时版本以及程序集重定向。 默认情况下,调用托管代码的 COM 互作应用程序使用计算机上安装的最新版本的运行时。

有关应用程序配置文件的详细信息,请参阅 “配置应用”。

确定要加载的运行时版本

公共语言运行时使用以下信息来确定要为应用程序加载的运行时版本:

  • 可用的运行时版本。

  • 应用程序支持的运行时版本。

支持的运行时版本

运行时使用应用程序配置文件和可移植可执行文件(PE)文件标头来确定应用程序支持的运行时版本。 如果没有应用程序配置文件,运行时将加载应用程序 PE 文件标头中指定的运行时版本(如果该版本可用)。

如果存在应用程序配置文件,运行时会根据以下过程的结果确定要加载的相应运行时版本:

  1. 运行时检查应用程序配置文件中的 <supportedRuntime> 元素 元素。 如果<supportedRuntime>元素中指定的一个或多个受支持的运行时版本存在,运行时将加载第一个<supportedRuntime>元素指定的运行时版本。 如果此版本不可用,运行时将检查下一 <个受支持的Runtime> 元素,并尝试加载指定的运行时版本。 如果这一运行时版本仍不可用,则检查后面的 <supportedRuntime> 元素。 如果没有受支持的运行时版本可用,运行时将无法加载运行时版本并向用户显示消息(请参阅步骤 3)。

  2. 运行时读取应用程序的可执行文件的 PE 文件标头。 如果 PE 文件标头指定的运行时版本可用,运行时将加载该版本。 如果指定的运行时版本不可用,运行时将寻找一个由 Microsoft 确定为与 PE 标头中的运行时版本兼容的运行时版本。 如果未找到该版本,该过程将继续执行步骤 3。

  3. 运行时会显示一条消息,指出应用程序支持的运行时版本不可用。 未加载运行时。

    注释

    可以使用注册表项 HKLM\Software\Microsoft\.NETFramework 中的 NoGuiFromShim 值,或使用环境变量 COMPLUS_NoGuiFromShim 来取消显示此消息。 例如,可以禁止显示通常不与用户交互的应用程序的消息,例如无人参与安装或 Windows 服务。 当此消息显示被禁止时,运行时会将一条消息写入事件日志。 将注册表值 NoGuiFromShim 设置为 1,以禁止计算机上所有应用程序显示此消息。 或者,可以将 COMPLUS_NoGuiFromShim 环境变量设置为 1,以在特定用户上下文中运行应用程序时不显示该消息。

注释

加载运行时版本后,程序集绑定重定向可以指定加载单个 .NET Framework 程序集的不同版本。 这些绑定重定向仅影响重定向的特定程序集。

部分限定的程序集名称和并行执行

由于它们是并行问题的潜在来源,因此部分限定的程序集引用只能用于绑定到应用程序目录中的程序集。 避免在代码中使用部分限定的程序集引用。

若要缓解代码中部分限定的程序集引用,可以使用 <应用程序配置文件中的 qualifiAssembly> 元素完全限定代码中发生的部分限定程序集引用。 应当使用 <qualifyAssembly> 元素来仅指定未在部分引用中设置的字段。 fullName 属性中列出的程序集标识必须包含完全限定程序集名称所需的所有信息:程序集名称、公钥、区域性和版本。

以下示例展示了应用程序配置文件中的条目,用于完整限定名为 myAssembly 的程序集。

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<qualifyAssembly partialName="myAssembly"
fullName="myAssembly,
      version=1.0.0.0,
publicKeyToken=...,
      culture=neutral"/>
</assemblyBinding>

每当程序集加载语句引用 myAssembly时,这些配置文件设置会导致运行时自动将部分限定 myAssembly 引用转换为完全限定的引用。 例如,Assembly.Load(“myAssembly”) 变为 Assembly.Load(“myAssembly, version=1.0.0.0, publicKeyToken=..., culture=neutral” )。

注释

可以使用 LoadWithPartialName 方法绕过公共语言运行时限制,该限制禁止从全局程序集缓存加载部分引用的程序集。 此方法应仅在远程处理方案中使用,因为它可以轻松地在并行执行中引起问题。

标题 DESCRIPTION
操作方法:启用和禁用自动绑定重定向 介绍如何将应用程序绑定到程序集的特定版本。
配置程序集绑定重定向 介绍如何将程序集绑定引用重定向到特定版本的 .NET Framework 程序集。
In-Process 并行执行 讨论如何使用进程内并行运行时宿主激活功能,在单个进程中运行多个版本的CLR。
.NET 中的程序集 提供程序集的概念性概述。
应用领域 提供应用程序域的概念性概述。

参考文献

<supportedRuntime> 元素