特定于运行时的应用不再独立
特定于运行时的应用,或具有 RuntimeIdentifier
的 .NET 应用,默认情况下不再独立。 而是变为默认依赖于框架。
这在以下情况下是一项中断性更改:
- 如果已部署、分发或发布应用,但未显式添加
SelfContained
属性,且无需在计算机上安装 .NET 运行时就能正常发挥作用。 在这种情况下,可能是依赖了先前的行为默认生成自包含应用。 - 如果依赖 IL 链接工具。 在这种情况下,执行建议的操作中所述步骤,再次使用 IL 链接。
旧行为
之前,如果(通过 RuntimeIdentifier)指定了运行时标识符 (RID),即使未显式指定 SelfContained
,应用也会发布为独立应用。
此外:
- 如果未将
PublishSelfContained
显式设置为false
,则发布属性PublishSingleFile
和PublishAot
就暗指了RuntimeIdentifier
,也即在包括dotnet build
、dotnet restore
和dotnet publish
在内的操作期间为SelfContained
(如果未指定)。 PublishTrimmed
属性未暗指SelfContained
。- 如果未指定
SelfContained
,则PublishReadyToRun
暗指了SelfContained
。
新行为
从 .NET 8 开始,对于面向 .NET 8 或更高版本的应用,RuntimeIdentifier
不再默认暗指 SelfContained
。 而是默认为指定运行时标识符的应用依赖于 .NET 运行时(依赖于框架)。 面向 .NET 7 或更早版本的应用将不受影响。
此外:
- 如果未将
PublishSelfContained
显式设置为false
,则发布属性PublishSingleFile
和PublishAot
现在仅在dotnet publish
期间(即不包括dotnet build
或dotnet 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>