修剪可能無法與 .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>