DefineConstants 評価時に使用できないターゲット フレームワークの場合

ターゲット フレームワーク関連の DefineConstants 項目 ( NETNET9_0_OR_GREATERNETSTANDARD2_0、および同様の定数など) は、MSBuild の評価時に計算されなくなりました。 MSBuild でこれらの定数 Condition プロジェクト ファイル内の属性を使用すると、想定どおりに機能しなくなります。

導入されたバージョン

.NET 10

以前の動作

以前は、DefineConstantsNETNETFRAMEWORK (省略可能なバージョンとNETSTANDARDサフィックス、例えば_OR_GREATERNET452_OR_GREATERなど) のような値がMSBuildの評価中に利用可能でした。 これにより、プロジェクト ファイル内の Condition 属性で直接使用できます。

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

新しい動作

.NET 10 以降では、ターゲット フレームワークの DefineConstants 値は、MSBuild の評価中ではなく、 Targetで計算されます。 その結果、TFM 関連の値のConditionを検査するDefineConstants属性は、それらの値が設定される前に評価され、期待どおりにトリガーされなくなります。

たとえば、次の条件は、評価時に NET9_0_OR_GREATERDefineConstants に存在しないため、正しく評価されなくなりました。

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

破壊的変更の種類

この変更は 動作の変更です。

変更理由

DefineConstantsに直接アクセスまたは操作すると、ユーザーが誤って値を上書きしました。 さらに、計算を Target に移動すると、他のツールで必要とされるより複雑な MSBuild オーケストレーション シナリオが可能になります。

  • 評価時に MSBuild 属性で TFM 関連の値 (DefineConstantsNET9_0_OR_GREATERなど) のNETSTANDARD2_0を検査Condition

  • ドキュメントに記載されている TargetPlatformを使用して、ターゲット フレームワークの互換性を確認してください。 例えば次が挙げられます。

    <!-- 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>
    
  • 自分で定義して制御する定数の属性でDefineConstantsCondition使用します。 この変更は、SDK が自動的に設定する TFM 関連の定数にのみ影響します。

影響を受ける API

なし。