共用方式為


修剪可能無法與 .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> 會產生錯誤,指出目標 Framework 不支援此設定。
  • <IsTrimmable><EnableTrimAnalyzer> 會產生警告,指出目標 Framework 不支援 <IsTrimmable>。 否則這些設定不會影響組建輸出。

導入的版本

.NET 8 RC 1

中斷性變更的類型

此變更為行為變更

變更原因

允許在 .NET Standard 或 .NET Framework 專案中使用 <PublishTrimmed> 可能會讓人產生此設定正在修剪輸出的錯誤印象,而實際上它沒有任何效果。

允許在 .NET Standard 或 .NET Framework 專案中使用 <IsTrimmable> or <EnableTrimAnalyzer> 代表程式庫作者可輕鬆選擇加入修剪,而不會收到關於修剪不相容性的警示。 由於 .NET Standard 和 .NET Framework 參考組件未針對修剪進行註釋,因此不會出現有關使用與修剪不相容的架構 API 的警告。

避免在鎖定 .NET Standard 或 .NET Framework 的專案中設定 <PublishTrimmed>。 也請避免設定 <PublishAot>,這表示之前的設定。

避免在鎖定 .NET Standard 或 .NET Framework 的程式庫中設定 <IsTrimmable><EnableTrimAnalyzer>。 也請避免設定 <IsAotCompatible>,這表示之前的設定。 相反地,請設定多個目標程式庫以包含最新的 TargetFramework,並只針對支援的目標 Framework 啟用 <IsTrimmable>。 設定 <IsTrimmable> 將使用最新版架構的修剪相容性註釋來執行最新版的修剪分析器。

例如,這些設定設定了多個目標,以包含 net8.0,並僅針對此目標 Framework 設定 <IsTrimmable>。 此邏輯會使用 IsTargetFrameworkCompatible,以便在第一次正式支援修剪時,將其套用至與 net6.0 相容的任何架構。 如此一來,新增目標 Framework 時就不需要更新條件。

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

另請參閱