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


строгая система именования

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

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

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

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

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

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

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

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

Замечание

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

✔️ Рассмотрите возможность строгого именования сборок библиотеки.

✔️ Рекомендуется добавить пару ключей строгого именования (учетную и частную) в систему контроля версий.

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

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

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

Это важно

Если необходимо удостоверить личность издателя кода, рекомендуется использовать Authenticode и подписание пакетов NuGet. Безопасность доступа к коду (CAS) не должна использоваться в качестве устранения рисков безопасности.

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

Узнайте больше о управлении версиями и версии сборки.

❌ НЕ добавляйте, удаляйте или изменяйте ключ строгого именования.

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

❌ НЕ публикуйте строго именованные и нестрого именованные версии библиотеки. Например, Contoso.Api и Contoso.Api.StrongNamed.

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