特定于运行时的应用不再独立

默认情况下,特定于运行时的应用或具有 RuntimeIdentifier 的 .NET 应用不再 独立。 相反,它们默认 依赖于框架

在以下情况下,这是一项重大更改:

  • 如果您已部署、分发或发布了应用程序,但没有显式添加 SelfContained 属性,而且您的应用不需要计算机上已安装 .NET 运行时才能正常工作。 在这种情况下,可能是依赖了先前的行为默认生成自包含应用。
  • 如果依赖 IL 链接工具。 在这种情况下,请执行 “建议操作” 中所述的步骤,再次使用 IL Link。

以前的行为

之前,如果(通过 RuntimeIdentifier)指定了运行时标识符 (RID),即使未显式指定 SelfContained,应用也会发布为独立应用。

此外:

  • 如果未将 PublishSelfContained 显式设置为 false,则发布属性 PublishSingleFilePublishAot 就暗指了 RuntimeIdentifier,也即在包括 SelfContaineddotnet builddotnet restore 在内的操作期间为 dotnet publish(如果未指定)。
  • PublishTrimmed 属性并不暗示 SelfContained
  • PublishReadyToRun 属性暗示 SelfContained ,如果未指定 SelfContained

新行为

从 .NET 8 开始,对于面向 .NET 8 或更高版本的应用, RuntimeIdentifier 默认情况下不再暗示 SelfContained 。 相反,指定运行时标识符的应用默认依赖于 .NET 运行时(依赖于框架)。 面向 .NET 7 或更早版本的应用不会受到影响。

此外:

  • 如果未将 PublishSelfContained 显式设置为 false,则发布属性 PublishSingleFilePublishAot 现在仅在 SelfContained 期间(即不包括 dotnet publishdotnet build)暗指 dotnet restore(如果未指定)。
  • PublishTrimmed 属性现在也暗指了在 SelfContained 期间为 dotnet publish
  • 如果项目目标是 .NET 8 或更高版本,则PublishReadyToRun属性不再暗示SelfContained

注释

如果使用 msbuild /t:Publish 发布,并且希望应用是独立的,那么就必须显式指定 SelfContained,即使项目具有已列出的发布属性之一也需如此。

已引入的版本

.NET 8 预览版 5

破坏性变更的类型

此更改会影响源兼容性二进制兼容性

更改原因

  • 新的 .NET SDK 行为与 Visual Studio 行为保持一致。
  • 默认情况下,依赖于框架的应用较小,因为每个应用中没有存储的 .NET 副本。
  • 当在应用外部管理 .NET 时(即进行依赖于框架的部署时),.NET 会更安全且保持最新状态。 具有运行时副本的应用不会获得安全更新。 默认情况下,此更改使更多的应用依赖于框架。
  • 理想情况下,命令行选项不会受影响。 在这种情况下,该工具支持特定于 RID 的自包含部署(SCD)和特定于 RID 的框架依赖部署(FDD)。 因此后列情况并无意义:没有 RID 默认为 FDD,以及没有 RID 默认为 SCD。 此行为通常使用户感到困惑。

.NET 6 通过以下警告提醒用户注意此重大变更:

警告 NETSDK1179:使用“--runtime”时,需要“--self-contained”或“--no-self-contained”选项之一。

现在客户已有时间显式添加 SelfContained,便可顺利引入该中断。

  • 如果您正在使用 .NET 7 或更早版本,并依赖于之前推断出的 SelfContained 行为,您会看到这个警告:

    对于 TargetFrameworks >= 8.0 的项目,RuntimeIdentifier 不再自动提供 SelfContained 应用。 若要在升级到 8.0 后继续创建独立于 .NET Framework 的应用,请考虑显式设置 SelfContained。

    按照警告指南操作,将应用声明为自包含应用。 可以在 项目文件 或命令行参数中执行此作, dotnet publish --self-contained例如。

  • 如果使用的是 .NET 8 并且想要保留以前的行为,请采用与前面所述的相同方式设置SelfContainedtrue

设置项目文件属性

SelfContained 是可以插入到项目文件中的 MSBuild 属性,它是具有 .csproj.vbproj.fsproj 扩展名的文件。 按如下所示设置属性:

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

另请参阅