DefineConstants pour les frameworks cibles non disponibles au moment de l’évaluation

Les éléments liés au DefineConstants framework cible (tels que NET, , NET9_0_OR_GREATERNETSTANDARD2_0et constantes similaires) ne sont plus calculés au moment de l’évaluation MSBuild. L’utilisation de ces constantes dans les attributs MSBuild Condition dans votre fichier projet ne fonctionnera plus comme prévu.

Version introduite

.NET 10

Comportement antérieur

Auparavant, DefineConstants valeurs telles que NET, NETFRAMEWORK et NETSTANDARD (avec des versions facultatives et des suffixes _OR_GREATER, tels que NET452_OR_GREATER ou NET9_0_OR_GREATER) étaient disponibles pendant l'évaluation de MSBuild. Cela vous a permis de les utiliser directement dans Condition les attributs de votre fichier projet :

<ItemGroup Condition="$(DefineConstants.Contains('NET9_0_OR_GREATER'))">
  <PackageReference Include="SomePackage" Version="1.0.0" />
</ItemGroup>

Nouveau comportement

À compter de .NET 10, les valeurs du framework DefineConstants cible sont calculées dans un Target, et non pendant l’évaluation MSBuild. En conséquence, les attributs Condition qui vérifient les valeurs liées au TFM de DefineConstants sont évalués avant que ces valeurs ne soient définies et ne se déclenchent plus comme prévu.

Par exemple, la condition suivante n'est plus évaluée correctement, car NET9_0_OR_GREATER n'est pas présent dans DefineConstants lors de l'évaluation :

<!-- This no longer works as expected -->
<ItemGroup Condition="$(DefineConstants.Contains('NET9_0_OR_GREATER'))">
  <PackageReference Include="SomePackage" Version="1.0.0" />
</ItemGroup>

Type de changement cassant

Ce changement est un changement de comportement.

Raison du changement

La manipulation ou l'accès direct à DefineConstants a conduit les utilisateurs à écraser accidentellement les valeurs. En outre, transférer le calcul dans un Target permet des possibilités d'orchestration MSBuild plus complexes requises par d'autres outils.

  • N’inspectezDefineConstants pas les valeurs liées au TFM (par exemple, NET9_0_OR_GREATER, NETSTANDARD2_0et similaires) dans les attributs MSBuild Condition au moment de l’évaluation.

  • Utilisez les fonctions MSBuild TargetFramework et TargetPlatform documentées pour vérifier la compatibilité de l’infrastructure cible. Par exemple:

    <!-- Condition on net9.0 or later (frameworks compatible with net9.0) -->
    <ItemGroup Condition="$([MSBuild]::IsTargetFrameworkCompatible('$(TargetFramework)', 'net9.0'))">
      <PackageReference Include="SomePackage" Version="1.0.0" />
    </ItemGroup>
    
    <!-- Condition on frameworks not compatible with net8.0 -->
    <ItemGroup Condition="!$([MSBuild]::IsTargetFrameworkCompatible('$(TargetFramework)', 'net8.0'))">
      <PackageReference Include="LegacyPackage" Version="2.0.0" />
    </ItemGroup>
    
  • Continuez à utiliser DefineConstants dans Condition les attributs pour les constantes que vous définissez et contrôlez vous-même. Cette modification affecte uniquement les constantes liées au module TFM que le Kit de développement logiciel (SDK) définit automatiquement.

API affectées

Aucun.