Поделиться через


Приложения, зависящие от среды выполнения, больше не автономные

Приложения, специфичные для среды выполнения, или приложения .NET с RuntimeIdentifier, по умолчанию больше не являются автономными. Вместо этого они зависят от платформы по умолчанию.

Это критическое изменение в следующих ситуациях:

  • Если вы развернули, распространили или опубликовали приложение и не добавили явно свойство SelfContained, но при этом не требовалось, чтобы среда выполнения .NET была установлена на компьютере для его работы. В этом случае, возможно, вы использовали предыдущее поведение для создания автономного приложения по умолчанию.
  • Если вы используете средство IL Link. В этом случае выполните действия, описанные в разделе "Рекомендуемое действие " для повторного использования IL Link.

Предыдущее поведение

Ранее, если был указан идентификатор среды выполнения (RID) (через RuntimeIdentifier), приложение было опубликовано как автономное, даже если SelfContained оно не было явно указано.

Дополнительно:

  • Если PublishSelfContained не было явно установлено в false, свойства публикации PublishSingleFile и PublishAot подразумевали RuntimeIdentifier и, следовательно, SelfContained (если он не был указан) во время операций, включая dotnet build, dotnet restore и dotnet publish.
  • Свойство PublishTrimmed не подразумевало SelfContained.
  • Свойство PublishReadyToRun подразумевает SelfContained, если SelfContained не указан.

Новое поведение

Начиная с .NET 8, для приложений, предназначенных для .NET 8 или более поздней версии, RuntimeIdentifier больше не подразумевается SelfContained по умолчанию. Вместо этого приложения, указывающие идентификатор среды выполнения, зависят от среды выполнения .NET по умолчанию (зависит от платформы). Приложения, предназначенные для .NET 7 или более ранних версий, не затрагиваются.

Дополнительно:

  • Если PublishSelfContained не задано явное значение false, свойства публикации PublishSingleFile и PublishAot теперь подразумевают SelfContained (если оно не указано) только во время dotnet publish (то есть не во время dotnet build или dotnet restore).
  • Свойство PublishTrimmed также теперь подразумевает SelfContained во время dotnet publish.
  • Свойство PublishReadyToRun больше не подразумевает, SelfContained предназначен ли проект для .NET 8 или более поздней версии.

Замечание

Если вы публикуете с использованием msbuild /t:Publish и хотите, чтобы приложение было автономным, необходимо явно указать параметр SelfContained, даже если у вашего проекта есть одно из перечисленных свойств публикации.

Представленная версия

.NET 8( предварительная версия 5)

Тип разрушающего изменения

Это изменение может повлиять на совместимость источников и совместимость двоичных файлов.

Причина изменения

  • Новое поведение пакета SDK для .NET соответствует поведению Visual Studio.
  • Приложения, зависящие от платформы, по умолчанию меньше, так как в каждом приложении нет копий .NET.
  • Если .NET управляется за пределами приложения (то есть для развертываний, зависящих от платформы), .NET остается более безопасным и up-to-date. Приложения, имеющие собственную копию среды выполнения, не получают обновления системы безопасности. Это изменение делает большее количество приложений зависимыми от платформы по умолчанию.
  • В идеале параметры командной строки являются ортогональными. В этом случае средство поддерживает как специфичное для RID автономное развертывание (SCD), так и специфичное для RID развертывание, зависящее от фреймворка (FDD). Поэтому было нелогично, что если нет RID, по умолчанию используется FDD, а если есть RID, по умолчанию используется SCD. Это поведение часто запутано для пользователей.

.NET 6 предупредил пользователей об этом критическом изменении со следующим предупреждением:

предупреждение NETSDK1179: При использовании "--runtime" требуется один из вариантов "--автономный" или "--не-автономный".

Теперь, когда у клиентов было время явно добавить SelfContained, можно ввести перерыв.

  • Если вы используете .NET 7 или более раннюю версию и полагаетесь на предыдущее поведение, где SelfContained было выведено, вы увидите следующее предупреждение:

    Для проектов с TargetFrameworks >= 8.0, идентификатор среды выполнения больше не предоставляет автономное приложение. Чтобы продолжить создание независимого приложения платформы .NET после обновления до версии 8.0, рекомендуется явно задать selfContained.

    Следуйте указаниям предупреждения и объявите приложение как автономное. Это можно сделать в файле проекта или в качестве аргумента командной строки, например dotnet publish --self-contained.

  • Если вы используете .NET 8 и хотите сохранить предыдущее поведение, установите SelfContained значение true таким же образом, как описано ранее.

Установить свойство файла проекта

SelfContained — это свойство MSBuild, которое можно вставить в файл проекта, который является файлом с расширением CSPROJ, VBPROJ или FSPROJ . Задайте свойство следующим образом:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    ...
    <SelfContained>true</SelfContained>
  </PropertyGroup>
</Project>

См. также