DefineConstants för målramverk som inte är tillgängliga vid utvärderingstillfället

De målramverksrelaterade DefineConstants objekten (till exempel NET, NET9_0_OR_GREATER, NETSTANDARD2_0och liknande konstanter) beräknas inte längre vid MSBuild-utvärderingstiden. Att använda dessa konstanter i MSBuild-attribut Condition i projektfilen fungerar inte längre som förväntat.

Version lanserad

.NET 10

Tidigare beteende

DefineConstants Tidigare var värden som NET, NETFRAMEWORKoch NETSTANDARD (med valfri version och _OR_GREATER suffix, till exempel NET452_OR_GREATER eller NET9_0_OR_GREATER) tillgängliga under MSBuild-utvärderingen. På så sätt kan du använda dem direkt i Condition attribut i projektfilen:

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

Nytt beteende

Från och med .NET 10 beräknas målramverksvärdena DefineConstants i en Target, inte under MSBuild-utvärderingen. Därför utvärderas attribut Condition som inspekterar DefineConstants för TFM-relaterade värden innan dessa värden anges och utlöses därmed inte längre som förväntat.

Följande villkor utvärderas till exempel inte längre korrekt eftersom NET9_0_OR_GREATER det inte finns i DefineConstants vid utvärderingstillfället:

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

Typ av brytande ändring

Den här ändringen är en beteendeförändring.

Orsak till ändringen

Direkt åtkomst eller manipulering av DefineConstants ledde till att användare oavsiktligt skrev över värdena. Dessutom möjliggör flytt av beräkningen till ett Target mer komplexa MSBuild-orkestreringsscenarier som krävs av andra verktyg.

  • Inspektera inteDefineConstants TFM-relaterade värden (till exempel NET9_0_OR_GREATER, NETSTANDARD2_0 och liknande) i MSBuild-attribut vid utvärdering Condition.

  • Använd den dokumenterade MSBuild TargetFramework och TargetPlatform funktionerna för att söka efter målramverkskompatibilitet. Som exempel:

    <!-- 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>
    
  • Fortsätt att använda DefineConstants i Condition attribut för konstanter som du definierar och kontrollerar själv. Den här ändringen påverkar bara de TFM-relaterade konstanter som SDK:t ställer in automatiskt.

Berörda API:er

Ingen.