默认情况下,特定于运行时的应用或具有 RuntimeIdentifier
的 .NET 应用不再 独立。 相反,它们默认 依赖于框架 。
在以下情况下,这是一项重大更改:
- 如果您已部署、分发或发布了应用程序,但没有显式添加
SelfContained
属性,而且您的应用不需要计算机上已安装 .NET 运行时才能正常工作。 在这种情况下,可能是依赖了先前的行为默认生成自包含应用。 - 如果依赖 IL 链接工具。 在这种情况下,请执行 “建议操作” 中所述的步骤,再次使用 IL Link。
以前的行为
之前,如果(通过 RuntimeIdentifier)指定了运行时标识符 (RID),即使未显式指定 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
。 - 如果项目目标是 .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>