DefineConstants für Zielframeworks zur Auswertungszeit nicht verfügbar

Die zielframeworkbezogenen Elemente (z. B. DefineConstants, NET, NET9_0_OR_GREATER und NETSTANDARD2_0 ähnliche Konstanten) werden zur MSBuild-Auswertungszeit nicht mehr berechnet. Die Verwendung dieser Konstanten in MSBuild-Attributen Condition in Ihrer Projektdatei funktioniert nicht mehr wie erwartet.

Eingeführt in Version

.NET 10

Bisheriges Verhalten

DefineConstants Bisher waren Werte wie NET, NETFRAMEWORK und NETSTANDARD (mit optionalen Versionen und _OR_GREATER-Suffixen, z.B. NET452_OR_GREATER oder NET9_0_OR_GREATER) während der MSBuild-Auswertung verfügbar. Auf diese Weise können Sie sie direkt in Condition Attributen in Ihrer Projektdatei verwenden:

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

Neues Verhalten

Ab .NET 10 werden die Zielframeworkwerte DefineConstants in einer Target, nicht während der MSBuild-Auswertung berechnet. Daher werden Condition Attribute, die DefineConstants auf TFM-bezogene Werte prüfen, ausgewertet, bevor diese Werte festgelegt werden und nicht mehr wie erwartet ausgelöst werden.

Die folgende Bedingung wird beispielsweise nicht mehr richtig ausgewertet, da NET9_0_OR_GREATER zum Zeitpunkt der Auswertung nicht in DefineConstants vorhanden ist.

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

Art der einschneidenden Änderung

Diese Änderung ist eine Verhaltensänderung.

Grund für die Änderung

Der direkte Zugriff oder die DefineConstants Manipulation führte dazu, dass Benutzer versehentlich die Werte überschrieben haben. Darüber hinaus ermöglicht das Verschieben der Berechnung in eine Target komplexere MSBuild-Orchestrierungsszenarien, die von anderen Tools benötigt werden.

  • Überprüfen DefineConstants auf TFM-bezogene Werte (zNET9_0_OR_GREATER. B. , NETSTANDARD2_0und ähnliche) in MSBuild-Attributen Condition zur Auswertungszeit.

  • Verwenden Sie die dokumentierten MSBuildTargetFramework- und TargetPlatform -Funktionen, um die Zielframeworkkompatibilität zu überprüfen. Beispiel:

    <!-- 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>
    
  • DefineConstants Attribute Condition für Konstanten, die Sie selbst definieren und steuern. Diese Änderung wirkt sich nur auf die TFM-bezogenen Konstanten aus, die vom SDK automatisch festgelegt werden.

Betroffene APIs

Keiner.