Параллельное выполнение в .NET FrameworkSide-by-Side Execution in the .NET Framework

Параллельное выполнение представляет собой возможность запускать несколько версий приложения или компонента с одного и того же компьютера.Side-by-side execution is the ability to run multiple versions of an application or component on the same computer. В одно и то же время на одном компьютере можно запускать несколько версий среды CLR, а также несколько версий приложений и компонентов, использующих одну из версий среды выполнения.You can have multiple versions of the common language runtime, and multiple versions of applications and components that use a version of the runtime, on the same computer at the same time.

На следующем рисунке показаны несколько приложений, которые используют две разные версии среды выполнения на одном компьютере.The following illustration shows several applications using two different versions of the runtime on the same computer. Приложения A, B и C используют среду выполнения версии 1.0, а приложение D использует версию 1.1.Applications A, B, and C use runtime version 1.0, while application D uses runtime version 1.1.

Параллельное выполнение разных версий среды выполнения,

.NET Framework состоит из среды CLR и набора сборок, содержащих типы API.The .NET Framework consists of the common language runtime and a collection of assemblies that contain the API types. Версии среды выполнения и сборок платформы .NET Framework устанавливаются раздельно.The runtime and the .NET Framework assemblies are versioned separately. Например, версия среды выполнения 4.0 на самом деле является версией 4.0.319, в то время как версия 1.0 сборок платформы .NET Framework — версией 1.0.3300.0.For example, version 4.0 of the runtime is actually version 4.0.319, while version 1.0 of the .NET Framework assemblies is version 1.0.3300.0.

На следующем рисунке показаны несколько приложений, которые используют две разных версии компонента на одном компьютере.The following illustration shows several applications using two different versions of a component on the same computer. Приложения A и B используют компонент версии 1.0, а приложение C использует версию 2.0 того же компонента.Application A and B use version 1.0 of the component while Application C uses version 2.0 of the same component.

Схема, показывающая параллельное выполнение компонента.

Параллельное выполнение позволяет более строго контролировать, к каким версиям компонента привязывается приложение и какую версию среды выполнения оно использует.Side-by-side execution gives you more control over which versions of a component an application binds to, and more control over which version of the runtime an application uses.

Преимущества параллельного выполненияBenefits of Side-by-Side Execution

До появления Microsoft Windows XP и платформы .NET Framework возникали конфликты библиотек DLL, поскольку приложения были не в состоянии различить несовместимые между собой версии одного и того же кода.Prior to Windows XP and the .NET Framework, DLL conflicts occurred because applications were unable to distinguish between incompatible versions of the same code. Сведения о типах, содержавшиеся в библиотеках DLL, были ограничены именем файла.Type information contained in a DLL was bound only to a file name. Приложение не могло различить, были ли типы в библиотеке DLL теми же, что применялись в приложении.An application had no way of knowing if the types contained in a DLL were the same types that the application was built with. В результате новая версия компонента могла перезаписать старую и привести к сбою в работе приложений.As a result, a new version of a component could overwrite an older version and break applications.

Следующие возможности параллельного выполнения и платформы .NET Framework исключают конфликты библиотек DLL:Side-by-side execution and the .NET Framework provide the following features to eliminate DLL conflicts:

  • Сборки со строгими именами.Strong-named assemblies.

    Параллельное выполнение использует сборки со строгими именами, чтобы привязать сведения о типе к определенной версии сборки.Side-by-side execution uses strong-named assemblies to bind type information to a specific version of an assembly. Это исключает возможность того, что приложение или компонент будут привязаны к неправильной версии сборки.This prevents an application or component from binding to an invalid version of an assembly. Сборки со строгими именами также позволяют нескольким версиям файла располагаться на одном компьютере и использоваться приложениями.Strong-named assemblies also allow multiple versions of a file to exist on the same computer and to be used by applications. Подробнее см. в статье Сборки со строгими именами.For more information, see Strong-Named Assemblies.

  • Хранилище, следящее за версией кода.Version-aware code storage.

    Платформа .NET Framework предоставляет хранилище, следящее за версией кода, в глобальном кэше сборок.The .NET Framework provides version-aware code storage in the global assembly cache. Глобальный кэш сборок — это кэш, в котором хранится используемый всеми приложениями на компьютере код. Подобный кэш есть на всех компьютерах, где установлена платформа .NET Framework.The global assembly cache is a computer-wide code cache present on all computers with the .NET Framework installed. Он хранит сборки на основании версии, языка и региональных параметров и сведений об издателе, а также поддерживает одновременное хранение разных версий одного и того же компонента или приложения.It stores assemblies based on version, culture, and publisher information, and supports multiple versions of components and applications. Дополнительные сведения см. в разделе Глобальный кэш сборок.For more information, see Global Assembly Cache.

  • Изоляция.Isolation.

    С помощью платформы .NET Framework можно создавать приложения и компоненты, которые работают изолированно.Using the .NET Framework, you can create applications and components that execute in isolation. Изоляция является неотъемлемой частью параллельного выполнения.Isolation is an essential component of side-by-side execution. Изоляция предполагает сбор сведений о задействованных ресурсах и безопасное совместное использование ресурсов несколькими версиями приложения или компонента.It involves being aware of the resources you are using and sharing resources with confidence among multiple versions of an application or component. Изоляция также предполагает сохранение файла с указанием версии.Isolation also includes storing files in a version-specific way. Дополнительные сведения об изоляции см. в разделе Рекомендации по созданию компонентов для параллельного выполнения.For more information about isolation, see Guidelines for Creating Components for Side-by-Side Execution.

Совместимость версийVersion Compatibility

Версии платформы .NET Framework 1.0 и 1.1 совместимы.Versions 1.0 and 1.1 of the .NET Framework are designed to be compatible with one another. Приложение, разработанное с помощью платформы .NET Framework версии 1.0, работает с версией 1.1, и наоборот.An application built with the .NET Framework version 1.0 should run on version 1.1, and an application built with the .NET Framework version 1.1 should run on version 1.0. Однако следует отметить, что функции API, добавленные в платформу .NET Framework версии 1.1, не будут работать в платформе .NET Framework версии 1.0.Note, however, that API features added in version 1.1 of the .NET Framework will not work with version 1.0 of the .NET Framework. Приложения, созданные с помощью версии 2.0, будут выполняться только в версии 2.0.Applications created with version 2.0 will run on version 2.0 only. Приложения версии 2.0 не будут выполняться в версии 1.1 или в более ранней версии.Version 2.0 applications will not run on version 1.1 or earlier.

В платформе .NET Framework версии рассматриваются как единые блоки, состоящие из среды выполнения и связанных с ней сборок платформы .NET Framework (концепция, называемая "унификацией сборок").Versions of the .NET Framework are treated as a single unit consisting of the runtime and its associated .NET Framework assemblies (a concept referred to as assembly unification). Можно перенаправлять привязку сборок, чтобы включить другие версии сборок платформы .NET Framework, но переопределение привязки по умолчанию рискованно и должно быть тщательно протестировано до развертывания.You can redirect assembly binding to include other versions of the .NET Framework assemblies, but overriding the default assembly binding can be risky and must be rigorously tested before deployment.

Обнаружение сведений о версии среды выполненияLocating Runtime Version Information

Сведения о том, в какой версии среды выполнения было скомпилировано приложение или компонент, а также о том, какие версии среды выполнения необходимы для запуска приложения, хранятся в двух местах.Information on which runtime version an application or component was compiled with and which versions of the runtime the application requires to run are stored in two locations. После компиляции приложения или компонента сведения о версии среды выполнения, использованной для этой компиляции, хранятся в управляемом исполняемом файле.When an application or component is compiled, information on the runtime version used to compile it is stored in the managed executable. Сведения о версиях среды выполнения, необходимых для приложения или компонента, хранятся в файле конфигурации приложения.Information on the runtime versions the application or component requires is stored in the application configuration file.

Сведения о версии среды выполнения в управляемом исполняемом файлеRuntime Version Information in the Managed Executable

Заголовок переносимого исполняемого (PE) файла каждого управляемого приложения и компонента содержит сведения о версии среды выполнения, в которой он был создан.The portable executable (PE) file header of each managed application and component contains information about the runtime version it was built with. Среда CLR использует эти сведения, чтобы определить наиболее вероятную версию среды выполнения, необходимую для запуска приложения.The common language runtime uses this information to determine the most likely version of the runtime the application needs to run.

Сведения о версии среды выполнения в файле конфигурации приложенияRuntime Version Information in the Application Configuration File

Кроме сведений в заголовке PE-файла приложение можно развернуть с использованием файла конфигурации приложения, в котором содержатся сведения о версии среды выполнения.In addition to the information in the PE file header, an application can be deployed with an application configuration file that provides runtime version information. Файл конфигурации приложения — это XML-файл, который создается разработчиком приложения и поставляется вместе с приложением.The application configuration file is an XML-based file that is created by the application developer and that ships with an application. Элемент <requiredRuntime> раздела <startup>, если таковой присутствует в этом файле, указывает, какие версии среды выполнения и какие версии компонента поддерживает приложение.The <requiredRuntime> Element of the <startup> section, if it is present in this file, specifies which versions of the runtime and which versions of a component the application supports. Его также можно использовать для тестирования совместимости приложения с разными версиями среды выполнения.You can also use this file in testing to test an application's compatibility with different versions of the runtime.

Неуправляемый код (включая приложения COM и COM+) может иметь файлы конфигурации приложения, используемые средой выполнения для взаимодействия с управляемым кодом.Unmanaged code, including COM and COM+ applications, can have application configuration files that the runtime uses for interacting with managed code. Файл конфигурации приложения влияет на любой управляемый код, активированный через COM.The application configuration file affects any managed code that you activate through COM. В файле можно указать, какие версии среды выполнения он поддерживает, а также какие сборки перенаправляет.The file can specify which runtime versions it supports, as well as assembly redirects. По умолчанию приложения COM-взаимодействия, вызывающие управляемый код, используют последнюю версию среды выполнения, установленную на компьютере.By default, COM interop applications calling to managed code use the latest version of the runtime installed on the computer.

Подробнее о файлах конфигурации приложений см. в разделе Настройка приложений.For more information about the application configuration files, see Configuring Apps.

Определение загружаемой версии среды выполненияDetermining Which Version of the Runtime to Load

Среда CLR использует следующие сведения, чтобы определить, какую версию среды выполнения необходимо загрузить для приложения:The common language runtime uses the following information to determine which version of the runtime to load for an application:

  • доступные версии среды выполнения;The runtime versions that are available.

  • версии среды выполнения, поддерживаемые приложением.The runtime versions that an application supports.

Поддерживаемые версии среды выполненияSupported Runtime Versions

Для определения версии среды выполнения, поддерживаемой приложением, среда выполнения использует файл конфигурации приложения и заголовок переносимого исполняемого (PE) файла.The runtime uses the application configuration file and the portable executable (PE) file header to determine which version of the runtime an application supports. Если файл конфигурации приложения отсутствует, среда выполнения загружает версию, указанную в заголовке PE-файла приложения, при ее наличии.If no application configuration file is present, the runtime loads the runtime version specified in the application's PE file header, if that version is available.

Если файл конфигурации приложения имеется, среда выполнения определяет подходящую версию для загрузки с помощью описанной ниже процедуры.If an application configuration file is present, the runtime determines the appropriate runtime version to load based on the results of the following process:

  1. Среда выполнения проверяет элемент <supportedRuntime> в файле конфигурации приложения.The runtime examines the <supportedRuntime> Element element in the application configuration file. Если в элементе <supportedRuntime> указана одна поддерживаемая версия или несколько, среда выполнения загружает версию, указанную в первом элементе <supportedRuntime>.If one or more of the supported runtime versions specified in the <supportedRuntime> element are present, the runtime loads the runtime version specified by the first <supportedRuntime> element. Если эта версия недоступна, среда выполнения проверяет следующий элемент <supportedRuntime> и предпринимает попытку загрузить указанную версию.If this version is not available, the runtime examines the next <supportedRuntime> element and attempts to load the runtime version specified. Если эта версия среды выполнения недоступна, проверяются следующие элементы <supportedRuntime>.If this runtime version is not available, subsequent <supportedRuntime> elements are examined. Если ни одна из поддерживаемых версий среды выполнения недоступна, среде выполнения не удается загрузить версию, и она выводит соответствующее сообщение (см. шаг 3).If none of the supported runtime versions are available, the runtime fails to load a runtime version and displays a message to the user (see step 3).

  2. Среда выполнения считывает заголовок PE-файла исполняемого файла приложения.The runtime reads the PE file header of the application's executable file. Если версия среды выполнения, указанная в этом заголовке, доступна, среда выполнения загружает ее.If the runtime version specified by the PE file header is available, the runtime loads that version. Если указанная версия недоступна, среда выполнения ищет версию, которая определена Майкрософт как совместимая с указанной в заголовке PE-файла.If the runtime version specified is not available, the runtime searches for a runtime version determined by Microsoft to be compatible with the runtime version in the PE header. Если эту версию найти не удается, процедура переходит к шагу 3.If that version is not found, the process continues to step 3.

  3. Среда выполнения выводит сообщение о том, что версия среды выполнения, поддерживаемая приложением, недоступна.The runtime displays a message stating that the runtime version supported by the application is unavailable. Среда выполнения не загружается.The runtime is not loaded.

    Примечание

    Вы можете отключить вывод сообщения, используя параметр NoGuiFromShim в разделе реестра HKLM\Software\Microsoft\.NETFramework или переменную среды COMPLUS_NoGuiFromShim.You can suppress the display of this message by using the NoGuiFromShim value under the registry key HKLM\Software\Microsoft\.NETFramework or using the environment variable COMPLUS_NoGuiFromShim. Например, можно отключить сообщение для приложений, которые обычно не взаимодействуют с пользователем, таких как автоматически устанавливаемые компоненты или службы Windows.For example, you can suppress the message for applications that do not typically interact with the user, such as unattended installations or Windows services. Если вывод сообщения отключен, среда выполнения записывает сообщение в журнал событий.When this message display is suppressed, the runtime writes a message to the event log. Чтобы отключить это сообщение для всех приложений на компьютере, присвойте параметру реестра NoGuiFromShim значение 1.Set the registry value NoGuiFromShim to 1 to suppress this message for all applications on a computer. Аналогично присвойте переменной среды COMPLUS_NoGuiFromShim значение 1, чтобы отключить сообщение для приложений, выполняющихся в контексте определенного пользователя.Alternately, set the COMPLUS_NoGuiFromShim environment variable to 1 to suppress the message for applications running in a particular user context.

Примечание

После загрузки версии среды выполнения перенаправления привязки сборок могут указывать, что будет загружена другая версия отдельной сборки .NET Framework.After a runtime version is loaded, assembly binding redirects can specify that a different version of an individual .NET Framework assembly be loaded. Такие перенаправления привязки влияют только на конкретную перенаправляемую сборку.These binding redirects affect only the specific assembly that is redirected.

Частичные имена сборок и параллельное выполнениеPartially Qualified Assembly Names and Side-by-Side Execution

Так как частичные ссылки на сборки потенциально являются источником проблем при параллельном выполнении, их следует применять только для привязки к сборкам в пределах каталога приложения.Because they are a potential source of side-by-side problems, partially qualified assembly references can be used only to bind to assemblies within an application directory. Использовать частичные ссылки на сборки в коде не рекомендуется.Avoid partially qualified assembly references in your code.

Чтобы снизить возможную опасность от частичных ссылок на сборки, при их применении в коде можно использовать элемент <qualifyAssembly> в файле конфигурации приложения и дать полные определения частичных ссылок на сборки.To mitigate partially qualified assembly references in code, you can use the <qualifyAssembly> element in an application configuration file to fully qualify partially qualified assembly references that occur in code. При использовании элемента <qualifyAssembly> следует указывать только те поля, которые не указаны в частичной ссылке.Use the <qualifyAssembly> element to specify only fields that were not set in the partial reference. Идентификатор сборки, указанный в атрибуте fullName, должен содержать все сведения, необходимые для задания полного имени сборки: имя, открытый ключ, язык и региональные параметры и версию сборки.The assembly identity listed in the fullName attribute must contain all the information needed to fully qualify the assembly name: assembly name, public key, culture, and version.

В примере ниже показана запись в файле конфигурации приложения для задания полного имени сборки myAssembly.The following example shows the application configuration file entry to fully qualify an assembly called 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 в полную ссылку.Whenever an assembly load statement references myAssembly, these configuration file settings cause the runtime to automatically translate the partially qualified myAssembly reference to a fully qualified reference. Например, Assembly.Load("myAssembly") преобразуется в Assembly.Load("myAssembly, version=1.0.0.0, publicKeyToken=..., culture=neutral").For example, Assembly.Load("myAssembly") becomes Assembly.Load("myAssembly, version=1.0.0.0, publicKeyToken=..., culture=neutral").

Примечание

С помощью метода LoadWithPartialName можно обойти ограничение среды CLR, которое запрещает загрузку сборок с частичными ссылками из глобального кэша сборок.You can use the LoadWithPartialName method to bypass the common language runtime restriction that prohibits partially referenced assemblies from being loaded from the global assembly cache. Этот метод следует использовать только в сценариях удаленного взаимодействия, так как он может привести к проблемам, связанным с параллельным выполнением.This method should be used only in remoting scenarios as it can easily cause problems in side-by-side execution.

ЗаголовокTitle ОписаниеDescription
Практическое руководство. Включение и отключение автоматического перенаправления привязкиHow to: Enable and Disable Automatic Binding Redirection Описание способов привязки приложения к определенной версии сборки.Describes how to bind an application to a specific version of an assembly.
Настройка перенаправления привязки сборокConfiguring Assembly Binding Redirection Рассматривается перенаправление ссылок на привязки сборок на определенную версию сборок .NET Framework.Explains how to redirect assembly binding references to a specific version of the .NET Framework assemblies.
Внутрипроцессное параллельное выполнениеIn-Process Side-by-Side Execution Описание порядка использования внутрипроцессной параллельной активации хост-приложения среды выполнения для запуска нескольких версий среды CLR в одном процессе.Discusses how you can use in-process side-by-side runtime host activation to run multiple versions of the CLR in a single process.
Сборки в среде CLRAssemblies in the Common Language Runtime Общие сведения о сборках.Provides a conceptual overview of assemblies.
Домены приложенийApplication Domains Общие сведения о доменах приложений.Provides a conceptual overview of application domains.

СсылкаReference

<Поддерживаемый элемент среды выполнения<supportedRuntime> Element