.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 6 и все будущие версии продолжат поддерживать .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 имеет 7 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
.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
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, НЕ ПОДЛЕЖИТ ОПРЕДЕЛЕНИЮ
Unity 2018.1

Дополнительные сведения см. в разделе .NET Standard 1,0. На сайте Версии .NET Standard доступна интерактивная таблица.

Какую версию .NET Standard выбрать в качестве целевой

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

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

Правила управления версиями .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 определяет .NET Standard интерфейсы API.

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

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

  • часть .NET Standard (только область действия);
  • несколько версий .NET Standard для данной области.

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

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

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

Пакеты NuGet нацелены на одну или несколько платформ. Пакеты библиотеки .NET Standard нацелены на платформу ".NET Standard". Платформу .NET Standard Framework можно выбрать с помощью netstandardnetstandard (например, netstandard1.4 ). Библиотеки, предназначенные для различных реализаций .NET, должны быть нацелены на эту платформу. Для самого широкого набора 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.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), либо Visual Studio для Mac версии 7.1 или более поздней (для macOS).

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

.NET 5+ и .NET Standard

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

  • net5.0

    Этот TFM предназначен для кода, который может выполняться везде. За некоторыми исключениями он включает только кроссплатформенные технологии. Для кода .NET 5 net5.0 заменяет моникеры целевой платформы netcoreapp и netstandard.

  • net5.0-windows

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

Выбор между .NET 5.0 или .NET 6.0 и .NET Standard

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

Ниже приводятся некоторые рекомендации по использованию нового кода для .NET 5+.

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

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

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

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

    Если вам не требуется поддержка .NET Framework, вы можете использовать .NET Standard 2.1 или .NET 5/6. Мы рекомендуем не использовать .NET Standard 2.1, перейдя непосредственно к .NET 6. Большинство широко распространенных библиотек предназначены одновременно для .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+ и ее реализацией нет. Это позволяет получить упрощенную схему моникеров целевой платформы. Для всех рабочих нагрузок (библиотеки, консольные приложения и веб-приложения) используется один префикс TFM: net5.0 или net6.0. Единственным вариантом является суффикс, указывающий API для конкретной платформы, например или net6.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.

См. также раздел