Condividi tramite


Il taglio non può essere usato con .NET Standard o .NET Framework

I progetti che impostano <PublishTrimmed>true</PublishTrimmed>, <IsTrimmable>true</IsTrimmable> o <EnableTrimAnalyzer>true</EnableTrimAnalyzer> con una versione TargetFramework qualsiasi di .NET Standard o .NET Framework generano un avviso o un errore perché il taglio non è supportato per questi framework di destinazione.

Comportamento precedente

In precedenza, se usate in un progetto .NET Standard o .NET Framework, queste impostazioni si comportavano nel modo seguente:

  • <PublishTrimmed>true</PublishTrimmed> non aveva alcun effetto.
  • <IsTrimmable>true</IsTrimmable> incorporava un attributo [assembly: AssemblyMetadata("IsTrimmable", "true")] a livello di assembly nell'assembly di output. Tale attributo optava per il trimming dell'assembly quando veniva usato in un'app tagliata (anche in un'app che usa <TrimMode>partial</TrimMode>).
  • <EnableTrimAnalyzer>true</EnableTrimAnalyzer> abilitava dell'analisi di taglio per la libreria, usando gli assembly di riferimento .NET Standard o .NET Framework corrispondenti al TargetFramework della libreria, anche se questi assembly di riferimento non venivano annotati per il taglio.

Nuovo comportamento

A partire dall’SDK .NET 8, in un progetto destinato a .NET Standard o .NET Framework:

  • <PublishTrimmed> genera un errore che indica che questa impostazione non è supportata dal framework di destinazione.
  • <IsTrimmable> e <EnableTrimAnalyzer> generano un avviso che indica che <IsTrimmable> non è supportato dal framework di destinazione. In caso contrario, queste impostazioni non hanno alcun effetto sull'output di compilazione.

Versione di introduzione

.NET 8 RC 1

Tipo di modifica che causa un'interruzione

Questa è una modifica funzionale.

Motivo della modifica

Consentire l'uso di <PublishTrimmed> in un progetto .NET Standard o .NET Framework poteva dare la falsa impressione che questa impostazione tagliasse l'output, quando in realtà non aveva alcun effetto.

Consentire l'uso di <IsTrimmable> o di <EnableTrimAnalyzer> in un progetto .NET Standard o .NET Framework voleva dire che era facile per gli autori delle librerie acconsentire esplicitamente al trimming senza essere avvisati delle relative incompatibilità. Poiché gli assembly di riferimento .NET Standard e .NET Framework non sono annotati per il taglio, non sono c’erano avvisi sugli usi delle API del framework incompatibili con il taglio.

Evitare di impostare <PublishTrimmed> nei progetti destinati a .NET Standard o .NET Framework. Evitare anche di impostare <PublishAot>, che implica l'impostazione precedente.

Evitare di impostare <IsTrimmable> o <EnableTrimAnalyzer> in librerie destinate a .NET Standard o .NET Framework. Evitare anche di impostare <IsAotCompatible>, che implica le impostazioni precedenti. Al contrario, si può utilizzare una libreria multi-target per includere la versione più recente di TargetFramework e abilitare <IsTrimmable> solo per i framework di destinazione supportati. L'impostazione di <IsTrimmable> eseguirà la versione più recente dell'analizzatore di taglio usando annotazioni sulla compatibilità di taglio dalla versione più recente del framework.

Ad esempio, usare queste impostazioni multi target per includere net8.0 e impostare <IsTrimmable> solo per questo framework di destinazione. Questa logica usa IsTargetFrameworkCompatible in modo che si applichi a tutti i framework compatibili con net6.0, quando il trimming è stato ufficialmente supportato. In questo modo, la condizione non deve essere aggiornata quando si aggiungono nuovi framework di destinazione.

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

Vedi anche