剪裁可能无法与 .NET Standard 或 .NET Framework 配合使用

使用任何版本的 .NET Standard 或 .NET Framework 的 TargetFramework 设置 <PublishTrimmed>true</PublishTrimmed><IsTrimmable>true</IsTrimmable><EnableTrimAnalyzer>true</EnableTrimAnalyzer> 的项目会生成警告或错误,因为这些目标框架不支持剪裁。

旧行为

以前,在 .NET Standard 或 .NET Framework 项目中使用时,这些设置的行为如下所示:

  • <PublishTrimmed>true</PublishTrimmed> 没有作用。
  • <IsTrimmable>true</IsTrimmable> 将程序集级别属性 [assembly: AssemblyMetadata("IsTrimmable", "true")] 嵌入到输出程序集中。 当在剪裁应用中使用时,该属性选择了程序集进行修整(即使是使用 <TrimMode>partial</TrimMode> 的应用)。
  • <EnableTrimAnalyzer>true</EnableTrimAnalyzer> 使用与库的 TargetFramework 对应的 .NET Standard 或 .NET Framework 引用程序集启用了剪裁分析,即使这些引用程序集没有剪裁的注释。

新行为

从 .NET 8 SDK 开始,在面向 .NET Standard 或 .NET Framework 的项目中:

  • <PublishTrimmed> 生成一个错误,指示目标框架不支持此设置。
  • <IsTrimmable><EnableTrimAnalyzer> 会生成一个警告,指示目标框架不支持 <IsTrimmable>。 否则,这些设置不会影响编译输出。

引入的版本

.NET 8 RC 1

中断性变更的类型

此更改为行为更改

更改原因

允许在 .NET Standard 或 .NET Framework 项目中使用 <PublishTrimmed> 可能会给人留下此设置会剪裁输出的错误印象,而实际它并不起作用。

允许在 .NET Standard 或 .NET Framework 项目中使用 <IsTrimmable><EnableTrimAnalyzer> 意味着库作者可以轻松选择剪裁,而不会收到剪裁不兼容的警报。 由于 .NET Standard 和 .NET Framework 引用程序集没有注释进行修整,因此没有关于使用与剪裁不兼容的框架 API 的警告。

不要在面向 .NET Standard 或 .NET Framework 的项目中 设置 <PublishTrimmed>。 也不要设置 <PublishAot>,这意味着以前的设置。

不要在面向 .NET Standard 或 .NET Framework 的项目中 设置 <IsTrimmable><EnableTrimAnalyzer>。 也不要设置 <IsAotCompatible>,这意味着以前的设置。 正确的做法是,对库设置多目标以包含最新的 TargetFramework,并仅为支持的目标框架启用 <IsTrimmable>。 设置 <IsTrimmable> 将使用最新版本框架中的剪裁兼容性注释来运行最新版本的剪裁分析器。

例如,这些设置会定义多目标以包含 net8.0,并仅为此目标框架设置 <IsTrimmable>。 此逻辑使用 IsTargetFrameworkCompatible,以便在首次正式支持剪裁时,它将应用于与 net6.0 兼容的任何框架。 这样一来,当添加新的目标框架时,条件就不需要更新。

<PropertyGroup>
  <TargetFrameworks>netstandard2.1;net8.0</TargetFrameworks>
  <IsTrimmable Condition="$([MSBuild]::IsTargetFrameworkCompatible('$(TargetFramework)', 'net6.0'))">true</IsTrimmable>
</PropertyGroup>

另请参阅