トリミングは、.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>

関連項目