DefineConstants voor doelframeworks die niet beschikbaar zijn tijdens de evaluatie

De doelframeworkgerelateerde DefineConstants items (zoals NET, NET9_0_OR_GREATER, en NETSTANDARD2_0, en vergelijkbare constanten) worden niet meer berekend tijdens de MSBuild-evaluatie. Het gebruik van deze constanten in MSBuild-kenmerken Condition in uw projectbestand werkt niet meer zoals verwacht.

Geïntroduceerde versie

.NET 10

Vorig gedrag

DefineConstants Voorheen waren waarden zoals NET, NETFRAMEWORKen NETSTANDARD (met optionele versie en _OR_GREATER achtervoegsels, zoals NET452_OR_GREATER of NET9_0_OR_GREATER) beschikbaar tijdens de MSBuild-evaluatie. Hierdoor kunt u ze rechtstreeks gebruiken in Condition kenmerken in uw projectbestand:

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

Nieuw gedrag

Vanaf .NET 10 worden de doelframeworkwaarden DefineConstants berekend in een Target, niet tijdens de MSBuild-evaluatie. Als gevolg hiervan worden Condition kenmerken die DefineConstants op TFM-gerelateerde waarden controleren geëvalueerd voordat deze waarden zijn ingesteld en worden ze niet meer zoals verwacht geactiveerd.

De volgende voorwaarde wordt bijvoorbeeld niet meer correct geëvalueerd omdat NET9_0_OR_GREATER niet aanwezig is in DefineConstants op het evaluatietijdstip.

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

Type van brekende verandering

Deze wijziging is een gedragswijziging.

Reden voor wijziging

Directe toegang of manipulatie van DefineConstants heeft ertoe geleid dat gebruikers per ongeluk de waarden overschrijven. Bovendien maakt het verplaatsen van de berekening naar een Target complexere MSBuild-indelingsscenario's mogelijk die vereist zijn voor andere hulpprogramma's.

  • Inspecteer niet op DefineConstants TFM-gerelateerde waarden (bijvoorbeeld NET9_0_OR_GREATER, NETSTANDARD2_0, en vergelijkbare) in MSBuild-kenmerken Condition tijdens de evaluatie.

  • Gebruik de gedocumenteerde MSBuild TargetFramework en TargetPlatform functies om te controleren op compatibiliteit met het doelframework. Voorbeeld:

    <!-- 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>
    
  • Blijf kenmerken gebruiken in DefineConstants attributen voor constanten die u zelf definieert en beheert Condition. Deze wijziging is alleen van invloed op de TFM-gerelateerde constanten die automatisch door de SDK worden ingesteld.

Betreffende API's

Geen.