Выбор версии .NET для использования

В этой статье описаны политики, используемые средствами .NET, пакетом SDK и средой выполнения для выбора версии. Эти политики обеспечивают баланс между запуском приложений с помощью указанных версий и упрощенным процессом обновления компьютеров разработчика и конечного пользователя. Эти политики включают:

  • Простое и эффективное развертывание .NET, включая обновления, повышающие безопасность и надежность.
  • Использование новейших средств и команд независимо от целевой среды выполнения.

Ситуации выбора версии:

В остальной части этой статьи рассматриваются эти четыре сценария.

Пакет SDK использует последнюю установленную версию

Команды пакета SDK включают dotnet new и dotnet run. В .NET CLI нужно выбрать версию пакета SDK для каждой команды dotnet. В CLI используется пакет SDK последней версии, установленный на компьютере по умолчанию, даже если:

  • проект предназначен для более ранней версии среды выполнения .NET;
  • последняя версия пакета SDK для .NET доступна в виде предварительной версии.

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

В редких случаях вам потребуется использовать более раннюю версию пакета SDK. Укажите эту версию в файле global.json. Политика использования последней версии означает, что вам придется использовать файл global.json, чтобы указать версию пакета SDK для .NET, если она раньше последней установленной версии.

Файл global.json можно поместить в любое место в иерархии файлов. Интерфейс командной строки выполняет поиск, переходя вверх от каталога проекта до первого найденного файла global.json. Вы сами выбираете, на какие проекты распространяется конкретный файл global.json, когда размещаете его в файловой системе. .NET CLI ищет файл global.json последовательно, двигаясь вверх от текущего рабочего каталога. Первый найденный файл global.json задает используемую версию. Если эта версия пакета SDK установлена, она будет использоваться. Если пакет SDK, указанный в global.json, не найден, то .NET CLI выбирает совместимый пакет SDK с помощью правил сопоставления. Если такой пакет не удается обнаружить, происходит сбой.

В следующем примере приводится синтаксис файла global.json.

{
  "sdk": {
    "version": "5.0.0"
  }
}

Процесс выбора версии пакета SDK выглядит следующим образом:

  1. dotnet выполняет поиск файла dotnet для последовательного просмотра пути вверх от текущего рабочего каталога.
  2. dotnet использует пакет SDK, указанный в первом обнаруженном dotnet .
  3. dotnet использует последний установленный пакет SDK, если не найден dotnet .

Дополнительные сведения о выборе версии пакета SDK см. в разделах Правила сопоставления и rollForward в обзоре global.json.

Моникеры целевой платформы определяют API во время сборки

Вы создаете проект на основе API, определенных в моникере целевой платформы (TFM). Вы указываете целевую платформу в файле проекта. Укажите элемент TargetFramework в файле проекта, как показано в следующем примере:

<TargetFramework>net5.0</TargetFramework>

Вы можете создать проект на основе нескольких моникеров целевой платформы. Обычно несколько целевых платформ указываются для библиотек, но с приложениями это тоже возможно. Укажите свойство TargetFrameworks (множественное число от TargetFramework). Целевые платформы разделяются точкой с запятой, как показано в следующем примере:

<TargetFrameworks>net5.0;netcoreapp3.1;net47</TargetFrameworks>

Данный пакет SDK поддерживает фиксированный набор платформ, вплоть до целевой платформы среды выполнения, с которой он поставляется. Например, пакет SDK для .NET 5 включает среду выполнения .NET 5, которая представляет собой реализацию целевой платформы net5.0. Пакет SDK для .NET 5 поддерживает netcoreapp2.0, netcoreapp2.1, netcoreapp3.0 и так далее, но не net6.0 (или более поздней версии). Установите пакет SDK для .NET 6, чтобы выполнить сборку для net6.0.

.NET Standard

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

Дополнительные сведения см. в статье .NET 5 и .NET Standard.

Накат платформозависимых приложений

Если вы запускаете приложение из источника с dotnet run из dotnet run с использованием или из зависящего от платформы исполняемого файла с использованием, исполняемый файл будет узлом для приложения.

Узел выбирает версию с последними исправлениями, установленную на компьютере. Например, если вы указали net5.0 в файле проекта, а 5.0.2 является последней установленной версией среды выполнения .NET, будет использоваться среда выполнения 5.0.2.

Если допустимая версия 5.0.* не найдена, используется новая версия 5.*. Например, если вы указали net5.0 и только 5.1.0 установлена, приложение будет работать в среде выполнения 5.1.0. Такое поведение называется «промежуточная версия наката». Более ранние версии также не будут рассматриваться. Если допустимая среда выполнения не установлена, приложение не будет работать.

Несколько примеров для демонстрации такого поведения, если вы используете версию 5.0:

  • ✔️ Указана версия 5.0. Последняя установленная версия с исправлениями — 5.0.3. Используется версия 5.0.3.
  • ❌ Указана версия 5.0. Нет установленных версий 5.0.*. Последняя установленная версия среды выполнения — 3.1.1. Отображается сообщение об ошибке.
  • ✔️ Указана версия 5.0. Нет установленных версий 5.0.*. Последняя установленная версия среды выполнения — 5.1.0. Используется версия 5.1.0.
  • ❌ Указана версия 3.0. Нет установленных версий 3.x. Последняя установленная версия среды выполнения — 5.0.0. Отображается сообщение об ошибке.

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

  1. Приложение требует установки версии 5.0.
  2. При запуске версия 5.0.* не установлена, зато установлена версия 5.1.0. Будет использоваться версия 5.1.0.
  3. Позже пользователь устанавливает 5.0.3 и запускает приложение еще раз. Теперь будет использоваться 5.0.3.

Версии 5.0.3 и 5.1.0 могут вести себя по-разному, особенно в таких сценариях, как сериализация двоичных данных.

Управление поведением наката

Поведение наката для приложения можно настроить четырьмя разными способами:

  1. Настройка на уровне проекта с помощью свойства <RollForward>:

    <PropertyGroup>
      <RollForward>LatestMinor</RollForward>
    </PropertyGroup>
    
  2. Файл *.runtimeconfig.json.

    Этот файл создается при компиляции приложения. Если свойство <RollForward> было задано в проекте, оно воспроизводится в файле *.runtimeconfig.json в качестве параметра rollForward. Пользователи могут редактировать этот файл, чтобы изменить поведение приложения.

    {
      "runtimeOptions": {
        "tfm": "net5.0",
        "rollForward": "LatestMinor",
        "framework": {
          "name": "Microsoft.NETCore.App",
          "version": "5.0.0"
        }
      }
    }
    
  3. Свойство --roll-forward <value> команды dotnet.

    При запуске приложения можно управлять поведением наката с помощью командной строки:

    dotnet run --roll-forward LatestMinor
    dotnet myapp.dll --roll-forward LatestMinor
    myapp.exe --roll-forward LatestMinor
    
  4. Переменная среды DOTNET_ROLL_FORWARD.

Приоритет

Поведение наката задается в следующем порядке при запуске приложения: пронумерованные элементы более высокого уровня имеют приоритет над пронумерованными элементами более низкого уровня.

  1. Сначала проверяется файл конфигурации *.runtimeconfig.json.
  2. Далее рассматривается переменная среды DOTNET_ROLL_FORWARD, переопределяющая предыдущую проверку.
  3. Наконец, любой параметр --roll-forward, переданный в запущенное приложение, переопределяет все остальное.

Значения

Для настройки поведения наката используйте одно из следующих значений:

Значение Описание
Minor Значение по умолчанию, если не указано.
Накат до дополнительной версии со следующим по порядку возрастания номером, если запрошенная дополнительная версия отсутствует. Если запрошенная дополнительная версия присутствует, используется политика LatestPatch.
Major Накат до следующей доступной основной версии или следующей дополнительной версии с наименьшим номером, если запрошенная дополнительная версия отсутствует. Если запрошенная дополнительная версия присутствует, используется политика Minor.
LatestPatch Накат до версии с наибольшим номером исправления. Это значение отключает накат до дополнительных версий.
LatestMinor Накат до дополнительной версии с наибольшим номером, даже если запрошенная дополнительная версия присутствует.
LatestMajor Накат до основной версии с наибольшим номером и дополнительной версии с наибольшим номером, даже если запрошенная основная версия присутствует.
Disable Не выполнять накат, привязывать только к указанной версии. Эта политика не рекомендуется для общего использования, поскольку отключает возможность наката до последних исправлений. Это значение рекомендуется использовать только для тестирования.

Автономные развертывания включают выбранную среду выполнения

Вы можете опубликовать приложение как автономный дистрибутив. При таком подходе среда выполнения .NET и библиотеки объединяются с вашим приложением. Автономные развертывания не зависят от среды выполнения. Выбор версии среды выполнения происходит во время публикации, а не запуска.

Событие восстановления, возникающее при публикации, выбирает последнюю версию исправления данного семейства среды выполнения. Например, dotnet publish выберет .NET 5.0.3, если это последняя версия исправления семейства среды выполнения .NET 5. Целевая платформа (включая последние установленные обновления безопасности) упаковывается с приложением.

Если минимальная версия, указанная для приложения, не предоставляется, возникнет ошибка. dotnet publish привязывает последнюю версию среды выполнения с исправлениями (без определенного семейства с основным и дополнительным номером версии). dotnet publish не поддерживает семантику наката dotnet run. Дополнительные сведения об исправлениях и автономных развертываниях см. в статье о выборе версии среды выполнения с исправлениями при развертывании приложений .NET.

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

<PropertyGroup>
  <RuntimeFrameworkVersion>5.0.7</RuntimeFrameworkVersion>
</PropertyGroup>

RuntimeFrameworkVersionЭлемент переопределяет политику версии по умолчанию. Для автономных развертываний RuntimeFrameworkVersion указывает RuntimeFrameworkVersion версию исполняющей среды. Для приложений, зависящих от платформы, RuntimeFrameworkVersion указывает RuntimeFrameworkVersion требуемую версию исполняющей среды.

См. также