.NET Standard

.NET Standard — это официальная спецификация для API .NET, которые должны быть доступны во всех реализациях .NET. .NET Standard была создана для того, чтобы повысить согласованность в экосистеме .NET. Тем не менее в .NET 5 реализован другой подход к обеспечению единообразия, в рамках которого во многих сценариях отсутствует необходимость использовать .NET Standard. Дополнительные сведения см. в разделе .NET 5 и .NET Standard этой статьи.

Поддержка реализации .NET

Различные реализации .NET реализуют конкретные версии .NET Standard. Каждая версия реализации .NET ориентирована на использование максимальной поддерживаемой ею версии .NET Standard. Это также означает, что она поддерживает и предыдущие версии. Например, .NET Framework 4.6 реализует .NET Standard 1.3, то есть предоставляет все API, определенные в стандартах .NET Standard версий 1.0–1.3. Аналогичным образом .NET Framework 4.6.1 реализует .NET Standard 1.4, а .NET 5.0 — .NET Standard 2.1.

В следующей таблице перечислены минимальные версии реализаций, которые поддерживают каждую версию .NET Standard. Это означает, что более поздние версии перечисленных реализаций также поддерживают соответствующую версию .NET Standard. Например, .NET Core 2.1 и более поздних версий поддерживает .NET Standard 2.0 и более ранних версий.

.NET Standard 1.0 1.1 1.2 1.3 1.4 1.5 1.6 2.0 2.1
.NET 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0
.NET Core 1.0 1.0 1.0 1.0 1.0 1.0 1.0 2.0 3.0
.NET Framework 1 4.5 4.5 4.5.1 4.6 4.6.1 4.6.12 4.6.12 4.6.12 N/A3
Mono 4.6 4.6 4.6 4.6 4.6 4.6 4.6 5,4 6.4
Xamarin.iOS 10.0 10.0 10.0 10.0 10.0 10.0 10.0 10.14 12.16
Xamarin.Mac 3.0 3.0 3.0 3.0 3.0 3.0 3.0 3.8 5.16
Xamarin.Android 7.0 7.0 7.0 7.0 7.0 7.0 7.0 8.0 10.0
Универсальная платформа Windows 10.0 10.0 10.0 10.0 10.0 10.0.16299 10.0.16299 10.0.16299 TBD
Unity 2018.1 2018.1 2018.1 2018.1 2018.1 2018.1 2018.1 2018.1 2021.2.0b6

1 Перечисленные версии для .NET Framework применимы к пакету SDK для .NET Core 2.0 и инструментарию более поздних версий. В предыдущих версиях использовалось другое сопоставление для .NET Standard 1.5 и более поздних версий. Если вы не можете обновить Visual Studio до версии 2017 и выше, можно скачать инструментарий для средств .NET Core для Visual Studio 2015.

2. Перечисленные здесь версии соответствуют правилам, которые NuGet использует для определения применимости указанной библиотеки .NET Standard. Хотя NuGet считает, что .NET Framework 4.6.1 поддерживает .NET Standard с версии 1.5 до 2.0, существует ряд проблем с использованием библиотек .NET Standard, созданных для этих версий из проектов .NET Framework 4.6.1. Для проектов .NET Framework, которым нужно использовать такие библиотеки, рекомендуем обновить проект и использовать в качестве целевой версию .NET Framework 4.7.2 или выше.

3 .NET Framework на поддерживает .NET Standard 2.1. Дополнительные сведения см. в объявлении .NET Standard 2.1.

  • Столбцы представляют версии .NET Standard. Каждая ячейка заголовка содержит ссылку на документ, который показывает, какие интерфейсы API добавлены в соответствующей версии .NET Standard.
  • Строки представляют различные реализации .NET.
  • Номер версии в каждой ячейке обозначает минимальную версию реализации, которая потребуется для работы с соответствующей версией .NET Standard.
  • На сайте Версии .NET Standard доступна интерактивная таблица.

Чтобы найти самую позднюю версию .NET Standard, на которую можно ориентироваться, выполните следующее:

  1. Найдите строку, которая соответствует вашей реализации .NET.
  2. Двигаясь по этой строке справа налево, найдите столбец, который содержит вашу версию платформы.
  3. Заголовок столбца указывает версию .NET Standard, которую поддерживает ваша целевая платформа. Соответственно, поддерживаются и все более ранние версии .NET Standard. Более поздние версии .NET Standard также будет поддерживать текущую реализацию.
  4. Повторите эту процедуру для всех платформ, с которыми вы будете работать. Если целевых платформ несколько, выберите из них самую младшую версию. Например, если вы хотите работать с .NET Framework 4.8 и .NET 5.0, наивысшей доступной версией .NET Standard будет .NET Standard 2.0.

Какую версию .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, входящие в стандарт. ref directory в репозиторий dotnet/standard определяет стандартные API-интерфейсы .NET.

Метапакет 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 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, которая активно разрабатывается корпорацией Майкрософт. Это отдельный продукт с единым набором возможностей и API, которые можно использовать для разработки классических приложений Windows, а также кроссплатформенных консольных приложений, облачных служб и веб-сайтов. Столь широкий спектр сценариев применения отражается с помощью моникеров целевой платформы (TFM) .NET 5.0:

  • net5.0

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

  • net5.0-windows

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

Выбор целевой платформы net5.0 или netstandard

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

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

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

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

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

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

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

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