.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 Standard
Версия .NET Standard. Каждая новая версия добавляет дополнительные API. При построении библиотеки для определенной версии .NET Standard она может выполняться в любой реализации .NET, реализующей ту версию .NET Standard (или более поздней).
Назначение более поздней версии .NET Standard позволяет библиотеке использовать больше API, но означает, что она может использоваться только в более поздних версиях .NET. Назначение более низкой версии уменьшает доступные API, но означает, что библиотека может работать в других местах.
Выбор версии .NET Standard
.NET Standard 1.0 содержит 79 949 доступных API-интерфейсов 37 118.
Реализация .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 |
.NET Framework | 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 |
Mono | 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 |
Универсальная платформа Windows | 8.0, 8.1, 10.0, 10.0.16299, ТБD |
Unity | 2018.1 |
Дополнительные сведения см. в статье .NET Standard 1.0. На сайте Версии .NET Standard доступна интерактивная таблица.
Какую версию .NET Standard выбрать в качестве целевой
Если вы используете .NET Standard, рекомендуется использовать .NET Standard 2.0, если вам не нужно поддерживать более раннюю версию. Большинство библиотек общего назначения не должны нуждаться в API вне .NET Standard 2.0, и платформа .NET Framework не поддерживает .NET Standard 2.1. Платформу .NET Standard 2.0 поддерживают все современные платформы. Ее рекомендуется использовать всегда, когда нужно реализовать кроссплатформенность с помощью одной целевой платформы.
Если вам требуется поддержка .NET Standard 1.x, мы рекомендуем также выбрать .NET Standard 2.0. .NET Standard 1.x распространяется в виде детализированного набора пакетов NuGet, который создает большой пакет граф зависимостей и приводит к загрузке большого количества пакетов при создании проекта. Дополнительные сведения см. в статье Кроссплатформенное нацеливание и разделе .NET 5+ и .NET Standard этой статьи.
Примечание.
Начиная с .NET 9, предупреждение сборки создается, если проект предназначен для .NET Standard 1.x. Дополнительные сведения см. в разделе "Предупреждение" для целевых объектов .NET Standard 1.x.
Правила управления версиями .NET Standard
Существует два основных правила управления версиями.
- Аддитивность. Все версии .NET Standard логически расширяются, то есть более поздние версии содержат все интерфейсы API предыдущих версий. Отсутствуют критические изменения между версиями.
- Неизменяемость: версии .NET после выпуска закрепляются в определенном состоянии.
После .NET Standard 2.1 выпуск новых версий не планируется. Дополнительные сведения см. в разделе .NET 5+ и .NET Standard этой статьи.
Спецификация
Спецификация .NET Standard представляет собой стандартизированный набор API. Она поддерживается реализаторами .NET, в частности корпорацией Майкрософт (для платформ .NET Framework, .NET Core и Mono) и Unity.
Официальные артефакты
Официальная спецификация — это набор CS-файлов, которые определяют API, входящие в стандарт. Каталог ссылок в репозитории dotnet/standard определяет API .NET Standard.
Метапакет NETStandard.Library (источник) описывает набор библиотек, определяющих (частично) одну версию .NET Standard.или несколько.
Отдельный компонент, например System.Runtime
, описывает следующее:
- часть .NET Standard (только область действия);
- несколько версий .NET Standard для данной области.
Доступны производные артефакты, упрощающие чтение и реализующие определенные сценарии для разработчика (например, использование компилятора).
- Список API с разметкой.
- Ссылочные сборки, распространяемые в виде пакетов NuGet и указанные в ссылках метапакета NETStandard.Library.
Представление пакетов
Основным средством распространения ссылочных сборок .NET Standard являются пакеты NuGet. Соответствующие реализации предоставляются различными способами, наиболее уместными для каждой реализации .NET.
Пакеты NuGet нацелены на одну или несколько платформ. Пакеты библиотеки .NET Standard нацелены на платформу ".NET Standard". Платформу .NET Standard можно использовать с помощью моникера платформы компактной netstandard
целевой платформы (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 Standard не связывается с какой-либо одной реализацией .NET и не зависит от схем управления версиями любой из этих реализаций.
Как отмечалось ранее, после .NET Standard 2.1 выпуск новых версий не планируется.
Нацеливание на .NET Standard
Вы можете создавать библиотеки .NET Standard с помощью сочетания платформы netstandard
и метапакета NETStandard.Library
.
Режим совместимости .NET Framework
Начиная с .NET Standard 2.0, доступен режим совместимости .NET Framework. Этот режим совместимости позволяет проектам .NET Standard ссылаться на библиотеки .NET Framework, как если бы они были скомпилированы для .NET Standard. Создание ссылок на библиотеки .NET Framework не работает для всех проектов, например таких, где библиотека использует API Windows Presentation Foundation (WPF).
Дополнительные сведения см. в разделе Режим совместимости .NET Framework.
Библиотеки .NET Standard и Visual Studio
Чтобы создать библиотеки .NET Standard в Visual Studio, убедитесь, что у вас есть Visual Studio 2022, 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 — это единый набор возможностей и API, которые можно использовать для классических приложений Windows и кроссплатформенных консольных приложений, облачных служб и веб-сайтов. Например, TFM .NET 8 отражают этот широкий спектр сценариев:
net8.0
Этот TFM предназначен для кода, который может выполняться везде. За некоторыми исключениями он включает только кроссплатформенные технологии. Для кода
net8.0
.NET 8 заменяет обаnetcoreapp
иnetstandard
TFM.net8.0-windows
Это пример TFM для конкретной ОС, которые добавляют функции соответствующей ОС в любые компоненты, на которые ссылается
net8.0
.
Когда следует использовать net8.0
vs. netstandard
Для существующего кода, предназначенного для .NET Standard 2.0 или более поздней версии, нет необходимости изменять TFM на net8.0
TFM или более поздней версии TFM. .NET 8 реализует .NET Standard 2.1 и более ранних версий. Единственная причина перенацеливать .NET Standard на .NET 8+ — получить доступ к дополнительным функциям среды выполнения, языковым функциям или API. Например, чтобы использовать C# 9, необходимо использовать .NET 5 или более позднюю версию. Вы можете получить доступ к новым функциям с несколькими сайтами .NET 8 и .NET Standard и по-прежнему иметь библиотеку, доступную для других реализаций .NET.
Примечание.
Если проект предназначен для .NET Standard 1.x, рекомендуется перенацелить его на .NET Standard 2.0 или .NET 6+. Дополнительные сведения см. в разделе "Предупреждение" для целевых объектов .NET Standard 1.x.
Ниже приводятся некоторые рекомендации по использованию нового кода для .NET 5+.
Компоненты приложения
Если вы используете библиотеки для разбиения приложения на несколько компонентов, рекомендуется использовать целевой объект
net8.0
. Для простоты рекомендуется использовать для всех проектов, входящих в состав приложения, одну версию .NET. Впоследствии вы можете полагать, что везде используются одни и те же функции библиотеки базовых классов.Повторно используемые библиотеки
Если вы создаете повторно используемые библиотеки, которые планируется поставлять в составе пакетов NuGet, следует выбирать оптимальное сочетание широты охвата и доступного набора функций. Последней версией, которую поддерживает .NET Framework, является .NET Standard 2.0, благодаря чему обеспечивается необходимая широта охвата платформ и достаточно полный набор доступных функций. Мы не рекомендуем указывать в качестве целевой платформы .NET Standard 1.x, так как в этом случае вы ограничиваете набор доступных функций при минимальном увеличении широты охвата.
Если вам не нужна поддержка платформа .NET Framework, можно использовать .NET Standard 2.1 или .NET 8. Мы рекомендуем пропустить .NET Standard 2.1 и перейти прямо к .NET 8. Наиболее широко используемые библиотеки с несколькими целевыми объектами для .NET Standard 2.0 и .NET 5+. Поддержка .NET Standard 2.0 обеспечивает максимальную широту охвата, в то время как поддержка .NET 5+ позволяет использовать новейшие функции платформы для клиентов, которые уже работают с .NET 5+.
Проблемы, связанные с .NET Standard
В этом разделе описываются некоторые проблемы, связанные с использованием .NET Standard. Вы узнаете, почему .NET 5 является предпочтительной платформой для совместного использования кода разными платформами и рабочими нагрузками:
Задержки с добавлением новых API
Платформа .NET Standard была создана как набор API, который должен поддерживать все реализации .NET, поэтому был определен процесс проверки предложений по добавлению новых API. Цель заключалась в том, чтобы стандартизировать только те API, которые могут быть реализованы на всех текущих и будущих платформах .NET. В результате, если был пропущен определенный выпуск функции, на ее добавление в версию Standard может уйти несколько лет. При этом ожидание того, что новая версия .NET Standard получит всеобщую поддержку, может длиться еще дольше.
Решение в .NET 5+. Когда функция реализована, она уже доступна для каждого приложения и библиотеки .NET 5+, так как база кода является общей. А поскольку различия между спецификацией API и его реализацией отсутствуют, вы можете воспользоваться преимуществами новых функций гораздо быстрее, чем в случае с .NET Standard.
Сложная система управления версиями
Разделение спецификации API и его реализации приводит к сложному сопоставлению между версиями спецификаций API и их реализаций. Эта видно из приведенной ранее в этой статье таблицы и инструкций по ее интерпретации.
Решение в .NET 5+. Разделения между спецификацией API .NET 5+ и ее реализацией нет. Это позволяет получить упрощенную схему моникеров целевой платформы. Для всех рабочих нагрузок (библиотеки, консольные приложения и веб-приложения) используется один префикс моникера целевой платформы:
net8.0
. Изменения касаются только суффикса, который определяет API, предназначенные для конкретной платформы, напримерnet8.0-windows
. Благодаря этому соглашению об именовании TFM можно легко определить, способно ли данное приложение использовать указанную библиотеку. При этом таблицы эквивалентности номеров версий, как в случае с .NET Standard, не требуются.Не поддерживаемые платформой исключения во время выполнения
.NET Standard предоставляет интерфейсы API для конкретных платформ. При этом ваш код может компилироваться без ошибок и выглядеть доступным для переноса на любую платформу, в то время как на самом деле это не так. При запуске на платформе, на которой отсутствует реализация для данного API, во время выполнения будут возникать ошибки.
Решение в .NET 5+. Пакеты SDK для .NET 5+ включают анализаторы кода, которые включены по умолчанию. Анализатор совместимости платформ обнаруживает непреднамеренное использование API, которые не поддерживаются на платформах, на которых предполагается работать. Дополнительные сведения см.в разделе Анализатор совместимости платформ.
Платформа .NET Standard не является устаревшей
.NET Standard по-прежнему требуется для библиотек, которые могут использоваться несколькими реализациями .NET. Указывать в качестве целевой платформы .NET Standard рекомендуется в следующих сценариях:
- Используйте
netstandard2.0
для совместного использования кода между .NET Framework и другими реализациями .NET. - Используйте
netstandard2.1
для совместного использования кода между Mono, Xamarin и .NET Core 3.x.