DefineConstants para marcos de destino que no están disponibles en el momento de la evaluación

Los elementos relacionados con la plataforma de destino DefineConstants (como NET, NET9_0_OR_GREATER, NETSTANDARD2_0, y constantes similares) ya no se calculan en tiempo de evaluación de MSBuild. El uso de estas constantes en atributos de MSBuild Condition en el archivo del proyecto ya no funcionará según lo previsto.

Versión introducida

.NET 10

Comportamiento anterior

Durante la evaluación de MSBuild, anteriormente estaban disponibles valores como NET, NETFRAMEWORK, y NETSTANDARD (con versiones opcionales y sufijos _OR_GREATER, como NET452_OR_GREATER o NET9_0_OR_GREATER). Esto le permitió usarlos directamente en Condition atributos del archivo del proyecto:

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

Nuevo comportamiento

A partir de .NET 10, los valores de la plataforma de destino DefineConstants se calculan en Target, y no durante la evaluación de MSBuild. Como resultado, Condition los atributos que evalúan DefineConstants los valores relacionados con TFM se procesan antes de que estos valores sean establecidos, y dejan de activarse como se esperaba.

Por ejemplo, la siguiente condición ya no se evalúa correctamente porque NET9_0_OR_GREATER no está presente en DefineConstants el momento de la evaluación:

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

Tipo de cambio disruptivo

Este es un cambio de comportamiento.

Motivo del cambio

Acceso directo o manipulación de DefineConstants llevó a los usuarios a sobrescribir accidentalmente los valores. Además, mover el cálculo a una Target habilita escenarios de orquestación de MSBuild más complejos requeridos por otras herramientas.

  • No inspeccione DefineConstants en busca de valores relacionados con TFM (por ejemplo, NET9_0_OR_GREATER, NETSTANDARD2_0, y similares) en los atributos de MSBuild Condition durante la evaluación.

  • Haz uso de las funciones documentadas de MSBuild TargetFramework y TargetPlatform para comprobar la compatibilidad con el marco de trabajo objetivo. Por ejemplo:

    <!-- 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>
    
  • Continúe usando DefineConstants en los atributos Condition para las constantes que usted mismo define y controla. Este cambio solo afecta a las constantes relacionadas con el TFM que el SDK establece automáticamente.

Las APIs afectadas

Ninguno.