.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 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 определяет API .NET Standard.

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

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

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

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

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

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

Пакеты NuGet нацелены на одну или несколько платформ. Пакеты библиотеки .NET Standard нацелены на платформу ".NET Standard". Ориентироваться на платформу .NET Standard можно с помощью компактного моникера целевой платформыnetstandard (например, 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 и метапакета 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, .NET 7 и .NET 8 — это единый набор возможностей и API, которые можно использовать для классических приложений Windows и кроссплатформенных консольных приложений, облачных служб и веб-сайтов. Например, TFM .NET 8 отражают этот широкий спектр сценариев:

  • net8.0

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

  • net8.0-windows

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

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

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

Ниже приводятся некоторые рекомендации по использованию нового кода для .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.

См. также