Partilhar via


O corte não pode ser usado com o .NET Standard ou o .NET Framework

Projetos que definem <PublishTrimmed>true</PublishTrimmed>, <IsTrimmable>true</IsTrimmable> ou <EnableTrimAnalyzer>true</EnableTrimAnalyzer> com um TargetFramework que é qualquer versão do .NET Standard ou .NET Framework produzem um aviso ou erro porque o corte não é suportado para essas estruturas de destino.

Comportamento anterior

Anteriormente, quando usadas em um projeto .NET Standard ou .NET Framework, essas configurações se comportavam da seguinte maneira:

  • <PublishTrimmed>true</PublishTrimmed> não surtiram efeito.
  • <IsTrimmable>true</IsTrimmable> Incorporado um atributo [assembly: AssemblyMetadata("IsTrimmable", "true")] de nível de montagem no assembly de saída. Esse atributo optou pelo corte do assembly quando consumido em um aplicativo cortado (mesmo um aplicativo que usa <TrimMode>partial</TrimMode>).
  • <EnableTrimAnalyzer>true</EnableTrimAnalyzer> habilitou a análise de corte para a biblioteca, usando os assemblies de referência do .NET Standard ou do .NET Framework correspondentes aos da biblioteca, mesmo que esses assemblies de referência não sejam anotados TargetFramework para corte.

Novo comportamento

Começando no SDK do .NET 8, em um projeto destinado ao .NET Standard ou .NET Framework:

  • <PublishTrimmed> Produz um erro indicando que essa configuração não é suportada para a estrutura de destino.
  • <IsTrimmable> e <EnableTrimAnalyzer> produzir um aviso indicando que <IsTrimmable> não há suporte para a estrutura de destino. Caso contrário, essas configurações não terão efeito na saída da compilação.

Versão introduzida

.NET 8 RC 1

Tipo de mudança de rutura

Esta mudança é uma mudança comportamental.

Razão para a alteração

Permitir o uso de em um projeto .NET Standard ou .NET Framework pode ter dado a falsa impressão de <PublishTrimmed> que essa configuração estava cortando a saída, quando na verdade não tinha efeito.

Permitir o uso de ou <EnableTrimAnalyzer> em um projeto .NET Standard ou .NET Framework significava que era fácil para os autores da <IsTrimmable> biblioteca optar pelo corte, sem serem alertados sobre incompatibilidades de corte. Como os assemblies de referência do .NET Standard e do .NET Framework não são anotados para corte, não houve avisos sobre usos de APIs de estrutura que são incompatíveis com o corte.

Evite definir <PublishTrimmed> em projetos destinados ao .NET Standard ou .NET Framework. Evite também a configuração <PublishAot> que implica a configuração anterior.

Evite definir <IsTrimmable> ou <EnableTrimAnalyzer> em bibliotecas destinadas ao .NET Standard ou .NET Framework. Evite também a configuração <IsAotCompatible>, que implica as configurações anteriores. Em vez disso, multi-target a biblioteca para incluir o mais recente TargetFrameworke habilitar <IsTrimmable> apenas para as estruturas de destino suportadas. A configuração <IsTrimmable> executará a versão mais recente do analisador de corte usando anotações de compatibilidade de corte da versão mais recente da estrutura.

Por exemplo, essas configurações de destino múltiplo para incluir net8.0e definir <IsTrimmable> apenas para essa estrutura de destino. Essa lógica é usada IsTargetFrameworkCompatible para que ela se aplique a quaisquer estruturas compatíveis com net6.0o , quando o corte foi oficialmente suportado pela primeira vez. Dessa forma, a condição não precisa ser atualizada ao adicionar novas estruturas de destino.

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

Consulte também