Partager via


Trimming peut ne pas être utilisé avec .NET Standard ou .NET Framework

Les projets qui définissent <PublishTrimmed>true</PublishTrimmed>, <IsTrimmable>true</IsTrimmable> ou <EnableTrimAnalyzer>true</EnableTrimAnalyzer> avec un TargetFramework pouvant être n’importe quelle version de .NET Standard ou .NET Framework produisent un avertissement ou une erreur, car le découpage n’est pas pris en charge pour ces frameworks cibles.

Comportement précédent

Auparavant, lorsqu’ils étaient utilisés dans un projet .NET Standard ou .NET Framework, ces paramètres se comportaient comme suit :

  • <PublishTrimmed>true</PublishTrimmed> n’a eu aucun effet.
  • <IsTrimmable>true</IsTrimmable> a incorporé un attribut au niveau de l’assembly [assembly: AssemblyMetadata("IsTrimmable", "true")] dans l’assembly de sortie. Cet attribut a choisi l’assembly en découpage lorsqu’il est consommé dans une application découpée (même une application qui utilise <TrimMode>partial</TrimMode>).
  • <EnableTrimAnalyzer>true</EnableTrimAnalyzer> a activé l’analyse de découpage de la bibliothèque, à l’aide d’assemblys de référence .NET Standard ou .NET Framework correspondant aux TargetFramework de la bibliothèque, même si ces assemblys de référence ne sont pas annotés pour le découpage.

Nouveau comportement

À partir du kit de développement logiciel (SDK) .NET 8, dans un projet ciblant .NET Standard ou .NET Framework :

  • <PublishTrimmed> génère une erreur indiquant que ce paramètre n’est pas pris en charge par l’infrastructure cible.
  • <IsTrimmable> et <EnableTrimAnalyzer> génèrent un avertissement indiquant que <IsTrimmable> n’est pas pris en charge par la version cible de .Net Framework. Ces paramètres n’ont pas d’effet sur la sortie de build.

Version introduite

.NET 8 RC 1

Type de changement cassant

Ce changement est un changement de comportement.

Raison du changement

L’utilisation de <PublishTrimmed> dans un projet .NET Standard ou .NET Framework peut avoir donné la fausse impression que ce paramètre a découpé la sortie, alors qu’en fait il n’avait aucun effet.

En autorisant l’utilisation de <IsTrimmable> ou de <EnableTrimAnalyzer> dans un projet .NET Standard ou .NET Framework, il était facile pour les auteurs de bibliothèques de choisir le découpage, sans être alertés sur les incompatibilités associées. Étant donné que les assemblys de référence .NET Standard et .NET Framework ne sont pas annotés pour le découpage, il n’y avait pas d’avertissements concernant des utilisations d’API de framework incompatibles avec le découpage.

Évitez de définir <PublishTrimmed> dans des projets qui ciblent .NET Standard ou .NET Framework. Évitez également de définir <PublishAot> qui implique l’ancien paramètre.

Évitez de définir <IsTrimmable> or <EnableTrimAnalyzer> dans des bibliothèques qui ciblent .NET Standard ou .NET Framework. Évitez également de définir <IsAotCompatible> qui implique l’ancien paramètre. Au lieu de cela, multiciblez la bibliothèque pour inclure la dernière TargetFrameworket activer <IsTrimmable> uniquement pour les frameworks cibles pris en charge. La définition de <IsTrimmable> exécute la dernière version de l’analyseur de découpage à l’aide d’annotations de compatibilité de découpage à partir de la dernière version de l’infrastructure.

Par exemple, ces paramètres multi-cibles doivent inclure net8.0 et définir <IsTrimmable> uniquement pour ce framework cible. Cette logique utilise IsTargetFrameworkCompatible afin qu’elle s’applique à toutes les infrastructures compatibles avec net6.0, lorsque le découpage a été officiellement pris en charge. De cette façon, la condition n’a pas besoin d’être mise à jour lors de l’ajout de nouveaux frameworks cibles.

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

Voir aussi