Opções de corte
As propriedades e os itens do MSBuild descritos neste artigo influenciam o comportamento de implantações cortadas e independentes. Algumas das opções mencionam ILLink
, que é o nome da ferramenta subjacente que implementa o corte. Para obter mais informações sobre a ferramenta subjacente, consulte a documentação do Trimmer.
O corte com PublishTrimmed
foi introduzido no .NET Core 3.0. As outras opções estão disponíveis no .NET 5 e versões posteriores.
Ativar corte
<PublishTrimmed>true</PublishTrimmed>
Habilite o corte durante a publicação. Essa configuração também desativa recursos incompatíveis com trim e permite a análise de trim durante a compilação. No .NET 8 e aplicativos posteriores, essa configuração também habilita a vinculação de configuração e os geradores de origem de delegados de solicitação.
Nota
Se você especificar o corte como habilitado na linha de comando, sua experiência de depuração será diferente e você poderá encontrar bugs adicionais no produto final.
Coloque essa configuração no arquivo de projeto para garantir que a configuração se aplique durante dotnet build
o , não apenas dotnet publish
.
Essa configuração permite cortar e cortar todos os assemblies por padrão. No .NET 6, somente assemblies que optaram por cortar via [AssemblyMetadata("IsTrimmable", "True")]
(adicionados em projetos que definiram <IsTrimmable>true</IsTrimmable>
) foram cortados por padrão. Você pode retornar ao comportamento anterior usando <TrimMode>partial</TrimMode>
.
Essa configuração também habilita o analisador Roslyn de compatibilidade de corte e desabilita recursos que são incompatíveis com o corte.
Granularidade de corte
Use a TrimMode
propriedade para definir a granularidade de corte como um partial
ou full
. A configuração padrão para aplicativos de console (e, a partir do .NET 8, aplicativos Web SDK) é full
:
<TrimMode>full</TrimMode>
Para cortar apenas assemblies que optaram por cortar, defina a propriedade como partial
:
<TrimMode>partial</TrimMode>
Se você alterar o modo de corte para partial
, você pode optar por assemblies individuais para cortar usando um <TrimmableAssembly>
item MSBuild.
<ItemGroup>
<TrimmableAssembly Include="MyAssembly" />
</ItemGroup>
Isso é equivalente à configuração [AssemblyMetadata("IsTrimmable", "True")]
ao construir a montagem.
Montagens raiz
Se um assembly não é cortado, ele é considerado "enraizado", o que significa que ele e todas as suas dependências estaticamente compreendidas serão mantidas. Assemblies adicionais podem ser "enraizados" pelo nome (sem a .dll
extensão):
<ItemGroup>
<TrimmerRootAssembly Include="MyAssembly" />
</ItemGroup>
Descritores raiz
Outra maneira de especificar raízes para análise é usando um arquivo XML que usa o formato de descritor de trimmer. Isso permite que você faça root em membros específicos em vez de um assembly inteiro.
<ItemGroup>
<TrimmerRootDescriptor Include="MyRoots.xml" />
</ItemGroup>
Por exemplo, MyRoots.xml
pode enraizar um método específico que é acessado dinamicamente pelo aplicativo:
<linker>
<assembly fullname="MyAssembly">
<type fullname="MyAssembly.MyClass">
<method name="DynamicallyAccessedMethod" />
</type>
</assembly>
</linker>
Avisos de análise
<SuppressTrimAnalysisWarnings>false</SuppressTrimAnalysisWarnings>
Habilite avisos de análise de corte.
O corte remove o IL que não é acessível estaticamente. Os aplicativos que usam reflexão ou outros padrões que criam dependências dinâmicas podem ser quebrados por corte. Para avisar sobre esses padrões, defina <SuppressTrimAnalysisWarnings>
como false
. Essa configuração exibirá avisos sobre todo o aplicativo, incluindo seu próprio código, código de biblioteca e código de estrutura.
Analisador Roslyn
A configuração PublishTrimmed
no .NET 6+ também habilita um analisador Roslyn que mostra um conjunto limitado de avisos de análise. Você também pode habilitar ou desabilitar o analisador independentemente do PublishTrimmed
.
<EnableTrimAnalyzer>true</EnableTrimAnalyzer>
Habilite um analisador Roslyn para um subconjunto de avisos de análise de corte.
Suprimir avisos
Você pode suprimir códigos de aviso individuais usando as propriedades usuais do MSBuild respeitadas pela cadeia de ferramentas, incluindo NoWarn
, WarningsAsErrors
, WarningsNotAsErrors
e TreatWarningsAsErrors
. Há uma opção adicional que controla o comportamento de aviso como erro do ILLink de forma independente:
<ILLinkTreatWarningsAsErrors>false</ILLinkTreatWarningsAsErrors>
Não trate os avisos ILLink como erros. Isso pode ser útil para evitar transformar avisos de análise de corte em erros ao tratar avisos do compilador como erros globalmente.
Mostrar avisos detalhados
No .NET 6+, a análise de corte produz no máximo um aviso para cada montagem proveniente de um PackageReference
, indicando que os internos do assembly não são compatíveis com o corte. Você também pode mostrar avisos individuais para todos os conjuntos:
<TrimmerSingleWarn>false</TrimmerSingleWarn>
Mostrar todos os avisos detalhados, em vez de colapsá-los para um único aviso por montagem.
Remover símbolos
Os símbolos são geralmente cortados para corresponder às montagens aparadas. Você também pode remover todos os símbolos:
<TrimmerRemoveSymbols>true</TrimmerRemoveSymbols>
Remova símbolos do aplicativo cortado, incluindo PDBs incorporados e arquivos PDB separados. Isso se aplica ao código do aplicativo e a quaisquer dependências que vêm com símbolos.
O SDK também torna possível desativar o suporte ao depurador usando a propriedade DebuggerSupport
. Quando o suporte ao depurador está desativado, o corte remove símbolos automaticamente (TrimmerRemoveSymbols
o padrão será true).
Trim recursos da biblioteca de estrutura
Várias áreas de recursos das bibliotecas de estrutura vêm com diretivas trimmer que tornam possível remover o código para recursos desativados.
Propriedade MSBuild | Description |
---|---|
AutoreleasePoolSupport |
Quando definido como false , remove o código que cria pools de liberação automática em plataformas suportadas. false é o padrão para o SDK do .NET. |
DebuggerSupport |
Quando definido como false , remove o código que permite melhores experiências de depuração. Essa configuração também remove símbolos. |
EnableUnsafeBinaryFormatterSerialization |
Quando definido como false , remove o suporte à serialização BinaryFormatter. Para obter mais informações, consulte Os métodos de serialização BinaryFormatter estão obsoletos e a implementação BinaryFormatter na caixa de entrada foi removida e sempre lança. |
EnableUnsafeUTF7Encoding |
Quando definido como false , remove o código de codificação UTF-7 inseguro. Para obter mais informações, consulte Os caminhos de código UTF-7 estão obsoletos. |
EventSourceSupport |
Quando definido como false , remove o código e a lógica relacionados a EventSource. |
HttpActivityPropagationSupport |
Quando definido como false , remove o código relacionado ao suporte de diagnóstico para System.Net.Http. |
InvariantGlobalization |
Quando definido como true , remove o código e os dados específicos da globalização. Para obter mais informações, consulte Modo invariante. |
MetadataUpdaterSupport |
Quando definido como false , remove a lógica específica de atualização de metadados relacionada à recarga a quente. |
MetricsSupport |
Quando definido como false , remove o suporte para System.Diagnostics.Metrics instrumentação. |
StackTraceSupport (.NET 8+) |
Quando definido como false , remove o suporte para gerar rastreamentos de pilha (por exemplo, Environment.StackTrace ou Exception.ToString) pelo tempo de execução. A quantidade de informações removidas das cadeias de caracteres de rastreamento de pilha pode depender de outras opções de implantação. Esta opção não afeta os rastreamentos de pilha gerados por depuradores. |
UseNativeHttpHandler |
Quando definido como true , usa a implementação de plataforma padrão do HttpMessageHandler para Android e iOS e remove a implementação gerenciada. |
UseSystemResourceKeys |
Quando definido como true , remove mensagens de exceção para System.* assemblies. Quando uma exceção é lançada de um System.* assembly, a mensagem é uma ID de recurso simplificada em vez da mensagem completa. |
XmlResolverIsNetworkingEnabledByDefault (.NET 8+) |
Quando definido como false , remove o suporte para resolver URLs que não sejam de arquivo no System.Xml. Somente a resolução do sistema de arquivos é suportada. |
Essas propriedades fazem com que o código relacionado seja cortado e também desabilitam recursos por meio do arquivo runtimeconfig . Para obter mais informações sobre essas propriedades, incluindo as opções de runtimeconfig correspondentes, consulte opções de recursos. Alguns SDKs podem ter valores padrão para essas propriedades.
Recursos do Framework desativados ao cortar
Os recursos a seguir são incompatíveis com o corte porque exigem código que não é referenciado estaticamente. Esses recursos são desativados por padrão em aplicativos cortados.
Aviso
Habilite esses recursos por sua conta e risco. É provável que quebrem aplicativos cortados sem trabalho extra para preservar o código referenciado dinamicamente.
<BuiltInComInteropSupport>
O suporte COM integrado está desativado.
<CustomResourceTypesSupport>
Não há suporte para o uso de tipos de recursos personalizados. Os caminhos de código do ResourceManager que usam reflexão para tipos de recursos personalizados são cortados.
<EnableCppCLIHostActivation>
A ativação do host C++/CLI está desabilitada.
<EnableUnsafeBinaryFormatterInDesigntimeLicenseContextSerialization>
DesigntimeLicenseContextSerializer O uso da
BinaryFormatter
serialização está desativado.<StartupHookSupport>
A execução de código antes
Main
comDOTNET_STARTUP_HOOKS
não é suportada. Para obter mais informações, consulte Gancho de inicialização do host.