Перенаправление версий сборки

Вы можете перенаправлять привязанные во время компиляции ссылки на сборки .NET Framework, сторонние сборки или сборки вашего собственного приложения. Вы можете перенаправлять свое приложение, чтобы оно использовало другую версию сборки, несколькими способами: через политику издателя, с помощью файла конфигурации приложения или с помощью файла конфигурации компьютера. В этой статье показывается, как привязка сборок работает в .NET Framework и как ее можно настроить.

Унификация сборок и привязка по умолчанию

Привязки к сборкам .NET Framework иногда перенаправляются в ходе процесса, называемого унификацией сборок. .NET Framework включает версию среды CLR и около двадцати сборок .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>

Использовать автоматическое перенаправление привязок

При создании классического приложения в Visual Studio, предназначенном для платформа .NET Framework 4.5.1 или более поздней версии, приложение использует автоматическое перенаправление привязки. Это означает, что если два компонента ссылаются на разные версии одной сборки со строгим именем, среда выполнения автоматически добавляет в выходной файл конфигурации приложения (app.config) перенаправление привязки в новую версию сборки. Это перенаправление переопределяет унификацию сборок, которая может происходить в противном случае. Исходный файл app.config не изменяется. Например, предположим, что приложение непосредственно ссылается на компонент .NET Framework вне потока, но использует стороннюю библиотеку, которая нацелена на более старую версию того же компонента. При компиляции приложения выходной файл конфигурации приложения изменяется, и в него включается перенаправление привязки в новую версию компонента. Если вы создаете веб-приложение, то получите предупреждение о конфликте привязки, которое в свою очередь дает вам возможность добавить необходимое перенаправление привязки в исходный файл веб-конфигурации.

Если вы вручную добавляете перенаправления привязок в исходный файл 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> элемент в файле конфигурации приложения и присвойте атрибуту Apply значение No, который переопределяет все предыдущие параметры Yes .

<publisherPolicy apply="no" />

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

Перенаправление версий на уровне компьютера

Иногда администратор компьютера хочет, чтобы все приложения на компьютере использовали определенную версию сборки. Например, конкретная версия может устранить брешь в системе безопасности. Если сборка перенаправляется в файл конфигурации компьютера с именем machine.config, все приложения на этом компьютере, использующие старую версию, направляются для использования новой версии. Файл конфигурации компьютера переопределяет файл конфигурации приложения и файл политики издателя. Этот файл machine.config находится по адресу %windir%\Microsoft.NET\Framework [ версии] \config\machine.config для 32-разрядных компьютеров или %WINDIR%\Microsoft.NET\Framework64 [ Version] \config\machine.config для 64-разрядных компьютеров.

Указание привязки сборки в файлах конфигурации

Один и тот же формат 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.

Для привязки сборки необходимо указать строку "urn: schemas-microsoft-com: ASM. v1" с атрибутом xmlns в <assemblyBinding> теге.

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

См. также