Поделиться через


Параллельное выполнение в .NET Framework

Замечание

Эта статья связана с .NET Framework. Он не применяется к более новым реализациям .NET, включая .NET 6 и более поздние версии.

Параллельное выполнение — это возможность запускать несколько версий приложения или компонента на одном компьютере. Вы можете использовать несколько версий среды CLR и несколько версий приложений и компонентов, использующих версию среды выполнения, на одном компьютере одновременно.

На следующем рисунке показаны несколько приложений, использующих две разные версии среды выполнения на одном компьютере. Приложения A, B и C используют среду выполнения версии 1.0, а приложение D использует среду выполнения версии 1.1.

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

Платформа .NET Framework состоит из среды CLR и коллекции сборок, содержащих типы API. Среда выполнения и сборки .NET Framework версионируются отдельно. Например, версия 4.0 среды выполнения фактически является версией 4.0.319, а версия 1.0 сборок .NET Framework фактически является версией 1.0.3300.0.

На следующем рисунке показаны несколько приложений с двумя разными версиями компонента на одном компьютере. Приложение A и B используют версию 1.0 компонента, а приложение C использует версию 2.0 одного компонента.

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

Параллельное выполнение обеспечивает более широкий контроль над версиями компонентов, к которым привязывается приложение, и больше контроля над версией среды выполнения, к которой используется приложение.

Преимущества параллельного выполнения

До Windows XP и .NET Framework возникали конфликты DLL-библиотек, так как приложения не могли различить несовместимые версии одного кода. Сведения о типе, содержащиеся в библиотеке DLL, привязаны только к имени файла. Приложение не имело способа знать, были ли типы, содержащиеся в библиотеке DLL, одинаковыми типами, с которыми было создано приложение. В результате новая версия компонента может перезаписать старую версию и разорвать приложения.

Совместное выполнение и платформа .NET Framework предоставляют следующие функции для устранения конфликтов DLL:

  • Сборки с сильными именами.

    Параллельное выполнение использует сборки с строгим именем для привязки сведений о типе к определенной версии сборки. Это предотвращает привязку приложения или компонента к недопустимой версии сборки. Сборки с строгими именами также позволяют существовать на одном компьютере несколько версий файла и использоваться приложениями. Дополнительные сведения см. в разделе Strong-Named Сборки.

  • Хранилище кода с поддержкой версий.

    Платформа .NET Framework предоставляет хранилище кода с поддержкой версий в глобальном кэше сборок. Глобальный кэш сборок — это кэш кода на уровне компьютера, который присутствует на всех компьютерах с установленной платформой .NET Framework. Он хранит сборки с учётом версии, культуры и информации об издателе, а также поддерживает множество версий компонентов и приложений. Дополнительные сведения см. в разделе "Глобальный кэш сборок".

  • Изоляция.

    С помощью .NET Framework можно создавать приложения и компоненты, которые выполняются в изоляции. Изоляция является важным компонентом параллельного выполнения. Это предполагает осознание использования ресурсов и уверенное предоставление общего доступа к ресурсам среди нескольких версий приложения или компонента. Изоляция также включает хранение файлов в определенной версии. Дополнительные сведения об изоляции см. в руководстве по созданию компонентов для параллельного выполнения.

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

Версии 1.0 и 1.1 платформы .NET Framework предназначены для обеспечения совместимости друг с другом. Приложение, созданное с .NET Framework версии 1.0, должно работать в версии 1.1, а приложение, созданное с помощью .NET Framework версии 1.1, должно работать в версии 1.0. Обратите внимание, что функции API, добавленные в версию 1.1 платформы .NET Framework, не будут работать с .NET Framework версии 1.0. Приложения, созданные с версией 2.0, будут работать только в версии 2.0. Приложения версии 2.0 не будут работать в версии 1.1 или более ранней.

Версии .NET Framework рассматриваются как единая единица, состоящая из среды выполнения и связанных сборок .NET Framework (концепция, называемая объединением сборок). Вы можете перенаправить привязку сборки, чтобы включить другие версии сборок .NET Framework, но переопределение привязки сборки по умолчанию может быть рисковано и должно быть тщательно проверено перед развертыванием.

Поиск сведений о версии среды выполнения

Сведения о том, какая версия среды выполнения была скомпилирована с приложением или компонентом, и с какими версиями среды выполнения приложение должно выполняться, хранятся в двух расположениях. При компиляции приложения или компонента сведения о версии среды выполнения, используемой для компиляции, хранятся в управляемом исполняемом файле. Сведения о версиях среды выполнения, необходимых приложению или компоненту, хранятся в файле конфигурации приложения.

Сведения о версии среды выполнения в управляемой исполняемой программе

Заголовок файла переносимого исполняемого файла (PE) каждого управляемого приложения и компонента содержит сведения о версии среды выполнения, с помощью которую она была создана. Среда CLR использует эти сведения для определения наиболее подходящей версии среды выполнения, чтобы приложение могло функционировать.

Сведения о версии среды выполнения в файле конфигурации приложения

Помимо сведений в заголовке PE-файла, приложение можно развернуть с помощью файла конфигурации приложения, предоставляющего сведения о версии среды выполнения. Файл конфигурации приложения — это XML-файл, созданный разработчиком приложения и который поставляется с приложением. Обязательный элемент <запрашиваемаяСреда> в <секции запуска>, если он присутствует в данном файле, указывает, какие версии среды выполнения и какие версии компонента поддерживает приложение. Этот файл можно также использовать для тестирования совместимости приложения с различными версиями среды выполнения.

Неуправляемый код, включая приложения COM и COM+, может иметь файлы конфигурации приложения, используемые средой выполнения для взаимодействия с управляемым кодом. Файл конфигурации приложения влияет на любой управляемый код, активируемый с помощью COM. Файл может указать, какие версии среды выполнения она поддерживает, а также перенаправления сборок. По умолчанию приложения COM-взаимодействия, вызывающие управляемый код, используют последнюю версию среды выполнения, установленной на компьютере.

Дополнительные сведения о файлах конфигурации приложения см. в разделе "Настройка приложений".

Определение версии среды выполнения для загрузки

Среда CLR использует следующие сведения, чтобы определить, какая версия среды выполнения загружается для приложения:

  • Доступные версии среды выполнения.

  • Версии среды выполнения, поддерживаемые приложением.

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

Среда выполнения использует файл конфигурации приложения и заголовок переносимого исполняемого файла (PE) для определения версии среды выполнения, которую поддерживает приложение. Если файл конфигурации приложения отсутствует, среда выполнения загружает версию среды выполнения, указанную в заголовке PE-файла приложения, если эта версия доступна.

Если файл конфигурации приложения присутствует, среда выполнения определяет соответствующую версию среды выполнения для загрузки на основе результатов следующего процесса:

  1. Среда выполнения проверяет элемент <supportedRuntime> в файле конфигурации приложения. Если присутствует одна или несколько поддерживаемых версий среды выполнения, указанных в элементе <supportedRuntime>, среда выполнения загружает версию, указанную первым элементом <supportedRuntime>. Если эта версия недоступна, среда выполнения проверяет следующий <поддерживаемый элементRuntime> и пытается загрузить указанную версию среды выполнения. Если эта версия среды выполнения недоступна, рассматриваются последующие элементы <supportedRuntime>. Если ни одна из поддерживаемых версий среды выполнения не доступна, среда выполнения не загружает версию среды выполнения и отображает сообщение пользователю (см. шаг 3).

  2. Среда выполнения считывает заголовок PE файла исполняемого приложения. Если доступна версия среды выполнения, указанная заголовком PE-файла, среда выполнения загружает такую версию. Если указанная версия среды выполнения недоступна, среда выполнения ищет версию среды выполнения, определяемую корпорацией Майкрософт, совместимую с версией среды выполнения в заголовке PE. Если эта версия не найдена, процесс продолжается на шаге 3.

  3. Среда выполнения отображает сообщение о том, что версия среды выполнения, поддерживаемая приложением, недоступна. Среда выполнения не загружена.

    Замечание

    Отображение этого сообщения можно отключить с помощью значения NoGuiFromShim в разделе реестра HKLM\Software\Microsoft\. NETFramework или использование переменной среды COMPLUS_NoGuiFromShim. Например, можно отключить сообщение для приложений, которые обычно не взаимодействуют с пользователем, например автоматические установки или службы Windows. При отключении отображения этого сообщения среда выполнения записывает сообщение в журнал событий. Задайте для параметра реестра NoGuiFromShim значение 1, чтобы отключить это сообщение для всех приложений на компьютере. Кроме того, задайте для переменной среды COMPLUS_NoGuiFromShim значение 1, чтобы отключить сообщение для приложений, работающих в определенном контексте пользователя.

Замечание

После загрузки версии среды выполнения перенаправления привязки сборок могут указывать, что загружается другая версия отдельной сборки .NET Framework. Эти перенаправления привязки влияют только на определенную сборку, перенаправленную.

Частично квалифицированные имена сборок и параллельное выполнение

Поскольку они являются потенциальным источником параллельных проблем, частично квалифицированные ссылки на сборки можно использовать только для привязки к сборкам в каталоге приложений. Избегайте частично квалифицированных ссылок на сборки в коде.

Чтобы устранить частично квалифицированные ссылки на сборки в коде, можно использовать <элемент qualifyAssembly> в файле конфигурации приложения, чтобы полностью квалифицировать частично квалифицированные ссылки на сборки, происходящие в коде. <Используйте элемент 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 можно использовать для обхода ограничения среды CLR, запрещающего загрузку частично указанных сборок из глобального кэша сборок. Этот метод следует использовать только в сценариях удаленного взаимодействия, так как это может легко вызвать проблемы в параллельном выполнении.

Название Описание
Как включить и отключить автоматическое перенаправление привязки Описывает, как привязать приложение к определенной версии сборки.
Настройка перенаправления привязки сборок Объясняет, как перенаправить ссылки на привязку сборок к определенной версии сборок .NET Framework.
In-Process параллельное выполнение Описывает использование параллельной активации узла среды выполнения для выполнения нескольких версий среды CLR в одном процессе.
Сборки в .NET Содержит концептуальный обзор сборок.
Домены приложений Содержит концептуальный обзор доменов приложений.

Справка

<элемент поддерживаемаяСредаВыполнения>