O corte de linha não pode ser utilizado 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 seja qualquer versão do .NET Standard ou do .NET Framework geram um aviso ou erro porque o corte não tem suporte para essas estruturas de destino.
Comportamento anterior
Anteriormente, quando usadas em um projeto do .NET Standard ou .NET Framework, essas configurações se comportavam da maneira a seguir:
<PublishTrimmed>true</PublishTrimmed>
não teve efeito.<IsTrimmable>true</IsTrimmable>
inseriu um atributo[assembly: AssemblyMetadata("IsTrimmable", "true")]
no nível do assembly 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 aosTargetFramework
da biblioteca, mesmo que esses assemblies de referência não estejam anotados para corte.
Novo comportamento
A partir do SDK do .NET 8, em um projeto direcionado ao .NET Standard ou .NET Framework:
<PublishTrimmed>
gera um erro indicando que esta configuração não é compatível com a estrutura de destino.<IsTrimmable>
ou<EnableTrimAnalyzer>
geram um aviso indicando que<IsTrimmable>
não é compatível com 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 alteração interruptiva
Esta é uma alteração comportamental.
Motivo da alteração
Permitir o uso de <PublishTrimmed>
em um projeto .NET Standard ou .NET Framework pode ter dado a falsa impressão de que essa configuração estava cortando a saída, quando na verdade não teve efeito.
Permitir o uso de <IsTrimmable>
ou <EnableTrimAnalyzer>
em um projeto .NET Standard ou .NET Framework significava que era fácil para os autores de bibliotecas optarem 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 o uso de APIs de estrutura incompatíveis com o corte.
Ação recomendada
Evite configurar o <PublishTrimmed>
em projetos direcionados ao .NET Standard ou .NET Framework. Evite também configurar o <PublishAot>
que impliquem a configuração anterior.
Evite configurar o <IsTrimmable>
ou <EnableTrimAnalyzer>
em bibliotecas direcionadas ao .NET Standard ou .NET Framework. Também evite configurar o <IsAotCompatible>
, o que implica nas configurações anteriores. Em vez disso, defina vários destinos para a biblioteca para incluir a TargetFramework
mais recente e habilitar <IsTrimmable>
apenas para as estruturas de destino com suporte. Configurar <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 são de vários destinos para incluir net8.0
e definir <IsTrimmable>
apenas para essa estrutura de destino. Essa lógica usa IsTargetFrameworkCompatible
para que seja aplicada a qualquer estrutura compatível com o net6.0
, quando o corte foi oficialmente permitido 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>