ターゲット フレームワーク関連の DefineConstants 項目 ( NET、 NET9_0_OR_GREATER、 NETSTANDARD2_0、および同様の定数など) は、MSBuild の評価時に計算されなくなりました。 MSBuild でこれらの定数 Condition プロジェクト ファイル内の属性を使用すると、想定どおりに機能しなくなります。
導入されたバージョン
.NET 10
以前の動作
以前は、DefineConstants、NET、NETFRAMEWORK (省略可能なバージョンとNETSTANDARDサフィックス、例えば_OR_GREATERやNET452_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_GREATER が DefineConstants に存在しないため、正しく評価されなくなりました。
<!-- 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 関連の値 (
DefineConstants、NET9_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>自分で定義して制御する定数の属性で
DefineConstantsをCondition使用します。 この変更は、SDK が自動的に設定する TFM 関連の定数にのみ影響します。
影響を受ける API
なし。
.NET