Бөлісу құралы:


.NET Standard

.NET Standard — это официальная спецификация API .NET, доступных в нескольких реализациях .NET. Мотивация .NET Standard заключалась в том, чтобы установить большую единообразие в экосистеме .NET. .NET 5 и более поздние версии применяют другой подход к созданию единообразия, благодаря чему в большинстве случаев отпадает необходимость в .NET Standard. Однако если вы хотите совместно использовать код между .NET Framework и любой другой реализацией .NET, например .NET Core, библиотека должна использовать .NET Standard 2.0. Никакие новые версии .NET Standard не будут выпускаться, но .NET 5 и все более поздние версии будут продолжать поддерживать .NET Standard 2.1 и более ранние версии.

Сведения о выборе между .NET 5 и .NET standard см. в разделе .NET 5+ и .NET Standard далее в этой статье.

.NET стандартные версии

.NET Standard имеет версии. Каждая новая версия добавляет дополнительные API. При построении библиотеки на основе определенной версии .NET Standard она может выполняться в любой .NET реализации, реализующей ту версию .NET Standard (или более поздней).

Выбор более новой версии .NET Standard позволяет библиотеке использовать больше API, но и означает, что она может использоваться только в более новых версиях .NET. Назначение более низкой версии уменьшает доступные API, но означает, что библиотека может работать в других местах.

Выберите версию .NET Standard

.NET Standard 1.0 имеет 7 949 из 37 118 доступных API.

реализация .NET Поддерживаемые версии
.NET и .NET Core 1.0, 1.1, 2.0, 2.1, 2.2, 3.0, 3.1, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0
платформа .NET 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
Моно 4,6, 5,4, 6,4
Xamarin.iOS 10.0, 10.14, 12.16
Xamarin. Mac 3.0, 3.8, 5.16
Xamarin. Android 7.0, 8.0, 10.0
Universal Windows Platform 8.0, 8.1, 10.0, 10.0.16299, Будет определено
Единство 2018.1

Дополнительные сведения см. в разделе .NET Standard 1.0. Интерактивная таблица см. в разделе .NET Стандартные версии.

Какую версию .NET Standard выбрать для целевой платформы

Если вы нацелены на .NET Standard, мы рекомендуем использовать .NET Standard 2.0, если нет необходимости поддерживать более раннюю версию. Большинство библиотек общего назначения не должны нуждаться в API за пределами .NET standard 2.0, а платформа .NET не поддерживает .NET standard 2.1. .NET Standard 2.0 поддерживается всеми современными платформами и рекомендуется поддерживать несколько платформ с одним целевым объектом.

Если необходимо поддерживать .NET Standard 1.x, рекомендуется также ориентироваться на .NET Standard 2.0. .NET стандартная версия 1.x распространяется в виде детализированного набора пакетов NuGet, который создает большой граф зависимостей пакета и приводит к загрузке большого количества пакетов при сборке проекта. Для получения дополнительной информации см. разделы кроссплатформенное нацеливание и .NET 5+ и .NET Standard далее в этой статье.

Примечание.

Начиная с .NET 9, предупреждение сборки выводится, если ваш проект нацелен на .NET Standard 1.x. Дополнительные сведения см. в разделе Предупреждения для целевых платформ .NET Standard 1.x.

правила управления версиями .NET Standard

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

  • Аддитивный: .NET стандартные версии логически концентричны: более высокие версии включают все API из предыдущих версий. Отсутствуют критические изменения между версиями.
  • Неизменяемый: после отправки .NET стандартные версии заморожены.

Новые версии .NET standard после версии 2.1 не будут. Дополнительные сведения см. в разделе .NET 5+ и .NET Standard далее в этой статье.

Спецификация

Спецификация .NET standard — это стандартизированный набор API. Спецификация поддерживается разработчиками .NET, в частности компанией Microsoft (включая платформу .NET Framework, .NET Core и Mono) и Unity.

Официальные артефакты

Официальная спецификация — это набор CS-файлов, которые определяют API, входящие в стандарт. Каталог ref в (теперь архивированном) dotnet/standard repository определяет API .NET Standard.

Метапакет NETStandard.Library метапакет (source) описывает набор библиотек, определяющих (часть) одну или несколько .NET стандартных версий.

Отдельный компонент, например System.Runtime, описывает следующее:

  • Часть .NET Standard (только ее охват).
  • Несколько версий .NET Standard для этой области.

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

Представление пакетов

Основным средством распространения референсных сборок .NET Standard являются пакеты NuGet. Реализации предоставляются различными способами, подходящими для каждой .NET реализации.

Пакеты NuGet нацелены на одну или несколько платформ. Пакеты .NET Standard предназначены для платформы ".NET Standard". Вы можете нацелиться на платформу .NET Standard с помощью монокера компактного целевого фреймворка (TFM), например netstandard1.4. Библиотеки, предназначенные для выполнения в нескольких реализациях .NET, должны быть нацелены на платформу .NET Standard. Для самого широкого набора API стоит выбрать netstandard2.0, так как число доступных API более чем удвоилось между .NET Standard 1.6 и 2.0.

Метапакет NETStandard.Library ссылается на полный набор пакетов NuGet, определяющих .NET Standard. Наиболее распространенным способом нацеливания на netstandard является ссылка на этот метапакет. Он описывает и предоставляет доступ к библиотекам ~40 .NET и связанным API, определяющим .NET Standard. Вы можете ссылаться на другие пакеты, предназначенные для netstandard, чтобы получить доступ к дополнительным интерфейсам API.

Управление версиями

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

.NET Стандарт не относится ни к одной реализации .NET, ни соответствует схеме управления версиями любой из этих реализаций.

Как отмечалось ранее, новые версии .NET standard после версии 2.1 не будут.

Цель .NET Standard

Вы можете создавать библиотеки .NET Standard с помощью сочетания платформы netstandard и метапакета NETStandard.Library.

режим совместимости платформы .NET

Начиная с версии .NET Standard 2.0, был представлен режим совместимости .NET Framework. Этот режим совместимости позволяет .NET стандартным проектам ссылаться на библиотеки .NET Framework, как если бы они были скомпилированы для .NET Standard. Ссылки на библиотеки .NET Framework не работают для всех проектов, таких как библиотеки, использующие API Windows Presentation Foundation (WPF).

Дополнительные сведения см. в режиме совместимости .NET Framework.

.NET стандартные библиотеки и Visual Studio

Чтобы создать библиотеки .NET standard в Visual Studio, убедитесь, что Visual Studio 2019 или более поздней версии или Visual Studio 2017 версии 15.3 или более поздней версии на Windows.

Если вам нужно использовать только библиотеки .NET Standard 2.0 в проектах, вы также можете сделать это в Visual Studio 2015. Но у вас должен быть установлен клиент NuGet версии 3.6 или более поздней. Вы можете скачать клиент NuGet для Visual Studio 2015 на странице скачивания NuGet.

.NET 5+ и .NET Standard

.NET 5, .NET 6, .NET 7, .NET 8, .NET 9 и .NET 10 — это единый набор возможностей и API, которые можно использовать для Windows классических приложений и кроссплатформенных консольных приложений, облачных служб и веб-сайтов. .NET 10 TFMs, например, отражают этот широкий спектр сценариев:

  • net10.0

    Этот TFM предназначен для кода, который может выполняться везде. За некоторыми исключениями он включает только кроссплатформенные технологии.

  • net10.0-windows

    Это пример TFM для конкретной ОС, который добавляет специфичную для ОС функциональность ко всему, на что net10.0 ссылается.

Когда следует использовать netx.0 против netstandard

Для существующего кода, предназначенного для .NET standard 2.0 или более поздней версии, нет необходимости изменять TFM на net8.0 или более поздней версии TFM. .NET 8, .NET 9 и .NET 10 реализуют .NET standard 2.1 и более ранних версий. Единственной причиной перенацеливать .NET standard на .NET 8+ является получение доступа к дополнительным функциям среды выполнения, языковым функциям или API. Например, чтобы использовать C# 9, необходимо использовать .NET 5 или более поздней версии. Вы можете использовать мультитаргетинг .NET и .NET Standard, чтобы получить доступ к новым функциям, при этом ваша библиотека останется совместимой с другими реализациями .NET.

Примечание.

Если проект предназначен для .NET standard 1.x, рекомендуется перенацелить его на .NET standard 2.0 или .NET 8+. Дополнительные сведения см. в разделе Предупреждения для целевых платформ .NET Standard 1.x.

Ниже приведены некоторые рекомендации по новому коду для .NET 5+:

  • Компоненты приложения

    Если вы используете библиотеки для разбиения приложения на несколько компонентов, рекомендуется использовать целевой объект net10.0. Для простоты рекомендуется сохранить все проекты, составляющие приложение в одной версии .NET. Впоследствии вы можете полагать, что везде используются одни и те же функции библиотеки базовых классов.

  • Повторно используемые библиотеки

    Если вы создаете повторно используемые библиотеки, которые планируется поставлять в составе пакетов NuGet, следует выбирать оптимальное сочетание широты охвата и доступного набора функций. .NET Standard 2.0 — это последняя версия, поддерживаемая .NET Framework, поэтому она обеспечивает хороший доступ с довольно большим набором функций. Мы не рекомендуем использовать целевую платформу .NET Standard 1.x, так как это ограничит доступный набор функций для незначительного расширения охвата.

    Если вам не нужна поддержка .NET Framework, можно использовать .NET standard 2.1 или .NET 10. Мы рекомендуем пропустить .NET standard 2.1 и перейти прямо к .NET 10. Большинство широко используемых библиотек с несколькими целевыми объектами для .NET Standard 2.0 и .NET 5+. Поддержка .NET Standard 2.0 обеспечивает наиболее доступные возможности, а поддержка .NET 5+ гарантирует, что вы можете использовать новейшие функции платформы для клиентов, которые уже находятся на .NET 5+.

.NET Стандартные проблемы

Ниже приведены некоторые проблемы с .NET Standard, которые помогают объяснить, почему .NET 5 и более поздних версий лучше использовать код на разных платформах и рабочих нагрузках:

  • Задержки с добавлением новых API

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

    Решение в .NET 5+: Когда функция реализована, она уже доступна для каждого приложения и библиотеки .NET 5+, так как кодовая база едина. И так как между спецификацией API и его реализацией нет разницы, вы можете воспользоваться преимуществами новых функций гораздо быстрее, чем с .NET Standard.

  • Сложная система управления версиями

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

    Solution в .NET 5+: Нет разделения между спецификацией API .NET 5+ и её реализацией. Полученная схема TFM упрощена. Для всех рабочих нагрузок используется один префикс TFM: net10.0 — это библиотеки, консольные приложения и веб-приложения. Изменения касаются только суффикса, который определяет API, предназначенные для конкретной платформы, например net10.0-windows. Благодаря этому соглашению об именовании TFM можно легко определить, способно ли данное приложение использовать указанную библиотеку. Таблица эквивалентов номера версии, подобная таблице для .NET Standard, не требуется.

  • Неподдерживаемые платформой исключения во время выполнения

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

    Solution в .NET 5+: Пакеты SDK .NET 5+ включают анализаторы кода, включенные по умолчанию. Анализатор совместимости платформ обнаруживает непреднамеренное использование API, которые не поддерживаются на платформах, на которых предполагается работать. Дополнительные сведения см.в разделе Анализатор совместимости платформ.

** .NET Standard не устарел

.NET Стандарт по-прежнему необходим для библиотек, которые могут использоваться несколькими .NET реализациями. Мы рекомендуем использовать .NET Standard для следующих случаев:

  • Используйте netstandard2.0 для совместного использования кода между .NET Framework и всеми другими реализациями .NET.
  • Используйте netstandard2.1 для совместного использования кода между Mono и .NET Core 3.x.

См. также