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

特定于运行时的应用,或具有 RuntimeIdentifier 的 .NET 应用,默认情况下不再独立。 而是变为默认依赖于框架

这在以下情况下是一项中断性更改:

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

旧行为

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

此外:

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

新行为

从 .NET 8 开始,对于面向 .NET 8 或更高版本的应用,RuntimeIdentifier 不再默认暗指 SelfContained。 而是默认为指定运行时标识符的应用依赖于 .NET 运行时(依赖于框架)。 面向 .NET 7 或更早版本的应用将不受影响。

此外:

  • 如果未将 PublishSelfContained 显式设置为 false,则发布属性 PublishSingleFilePublishAot 现在仅在 dotnet publish 期间(即不包括 dotnet builddotnet restore)暗指 SelfContained(如果未指定)。
  • PublishTrimmed 属性现在也暗指了在 dotnet publish 期间为 SelfContained
  • 如果项目面向 .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 并希望保留以前的行为,请按前文所述方式将 SelfContained 设置为 true

设置项目文件属性

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

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

另请参阅