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


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

Примечание.

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

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

Совет

Эта статья связана с платформа .NET Framework приложениями. Сведения о загрузке сборок в .NET 5+ (и .NET Core) см. в разделе о загрузке зависимостей в .NET.

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

Привязки к сборкам .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> в элемент зависимогоAssembly<>в файле конфигурации приложения и задайте для атрибута no, который переопределяет все предыдущие параметры да.

<publisherPolicy apply="no" />

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

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

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

Ограничение привязок сборок к определенной версии

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

См. также