Строгое именование

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

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

<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <dependentAssembly>
            <assemblyIdentity name="myAssembly" publicKeyToken="32ab4ba45e0a69a1" culture="neutral" />
            <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0"/>
         </dependentAssembly>
      </assemblyBinding>
   </runtime>
</configuration>

Если разработчик .NET выражает недовольство строгим именованием, он скорее всего имеет в виду именно строгую загрузку сборок. К счастью, эта проблема касается только платформы .NET Framework. В .NET 5 и более поздних версий, .NET Core, Xamarin, универсальной платформе Windows и большинстве других реализаций .NET не применяется строгая загрузка сборок, что избавляет нас от основного недостатка строгого именования.

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

Преимущества строгого именования на платформа .NET Framework:

  1. Сборку можно указывать и использовать в других сборках со строгими именами.
  2. Сборку можно хранить в глобальном кэше сборок.
  3. Сборку можно загружать параллельно с другими версиями этой сборки. Параллельная загрузка нескольких версий сборки часто используется в приложениях с поддержкой подключаемых модулей.

Строгое именование не имеет преимуществ для .NET Core/5+. Компилятор C# выдает предупреждение CS8002 для сборок с строгим именем, ссылающихся на нестрогую именованные сборки. Это предупреждение можно отключить только для библиотек, предназначенных только для .NET Core/5+.

Создание библиотек .NET со строгими именами

Следует строго назвать библиотеки .NET с открытым кодом, если их целевые объекты включают платформа .NET Framework или .NET Standard. Строгое именование не требуется для библиотек, предназначенных только для .NET Core/5+.

Примечание.

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

✔ РЕКОМЕНДУЕТСЯ использовать строгое именование для сборок библиотеки.

✔️ РЕКОМЕНДУЕТСЯ добавлять ключ строгого именования в систему управления версиями.

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

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

Внимание

Если важно поддерживать для кода идентификацию издателя, мы рекомендуем применить Authenticode и Подписывание пакетов NuGet. Управление доступом для кода (CAS) не следует применять в качестве меры безопасности.

✔ РЕКОМЕНДУЕТСЯ увеличивать номер версии для сборки только при изменении основного номера версии, чтобы избавить пользователей от лишних переадресаций привязок и частого их обновления.

См. сведения о версиях сборок и управлении версиями.

❌ НЕ СЛЕДУЕТ добавлять, удалять или изменять ключ строгого именования.

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

❌ НЕ СЛЕДУЕТ публиковать версии библиотеки со строгим и нестрогим именем. Например, Contoso.Api и Contoso.Api.StrongNamed.

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