DefineConstants per i framework di destinazione non disponibili al momento della valutazione

Gli elementi correlati al DefineConstants framework di destinazione (ad esempio NET, NET9_0_OR_GREATERNETSTANDARD2_0, e costanti simili) non vengono più calcolati in fase di valutazione di MSBuild. L'uso di queste costanti negli attributi di MSBuild Condition nel file di progetto non funzionerà più come previsto.

Versione introdotta

.NET 10

Comportamento precedente

In precedenza, DefineConstants i valori come NET, NETFRAMEWORKe NETSTANDARD (con versione facoltativa e _OR_GREATER suffissi, ad esempio NET452_OR_GREATER o NET9_0_OR_GREATER) erano disponibili durante la valutazione di MSBuild. In questo modo è possibile usarli direttamente negli Condition attributi nel file di progetto:

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

Nuovo comportamento

A partire da .NET 10, i valori del framework DefineConstants di destinazione vengono calcolati in una fase successiva, non durante la valutazione di MSBuild. Di conseguenza, Condition gli attributi che controllano DefineConstants i valori correlati a TFM vengono valutati prima che tali valori vengano impostati e di conseguenza non si attivano più come previsto.

Ad esempio, la condizione seguente non restituisce più correttamente perché NET9_0_OR_GREATER non è presente in DefineConstants in fase di valutazione:

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

Tipo di cambiamento che interrompe la compatibilità

Questa modifica è una modifica funzionale.

Motivo della modifica

L'accesso diretto o la manipolazione di DefineConstants hanno portato a sovrascrivere accidentalmente i valori. Inoltre, lo spostamento del calcolo in un Target consente scenari di orchestrazione MSBuild più complessi richiesti da altri strumenti.

  • Non esaminare DefineConstants i valori correlati a TFM (ad esempio, NET9_0_OR_GREATER, NETSTANDARD2_0e simili) negli attributi MSBuild Condition in fase di valutazione.

  • Assicurati di usare le funzioni TargetFramework e TargetPlatform di MSBuild documentate per verificare la compatibilità del framework di destinazione. Per esempio:

    <!-- 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>
    
  • Continuare a usare DefineConstants negli Condition attributi per le costanti definite e controllate manualmente. Questa modifica influisce solo sulle costanti correlate a TFM impostate automaticamente dall'SDK.

Le API interessate

Nessuno.