DefineConstants para estruturas de destino não disponíveis no momento da avaliação

Os itens relacionados ao framework de destino DefineConstants (como NET, NET9_0_OR_GREATER, NETSTANDARD2_0 e constantes semelhantes) não são mais computados no tempo de avaliação do MSBuild. O uso dessas constantes em atributos do MSBuild Condition no arquivo de projeto não funcionará mais conforme o esperado.

Versão introduzida

.NET 10

Comportamento anterior

Anteriormente, DefineConstants valores como NET, NETFRAMEWORKe NETSTANDARD (com versão e _OR_GREATER sufixos opcionais, como NET452_OR_GREATER ou NET9_0_OR_GREATER) estavam disponíveis durante a avaliação do MSBuild. Isso permitiu que você os usasse diretamente em Condition, atributos em seu arquivo de projeto.

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

Novo comportamento

A partir do .NET 10, os valores da estrutura de destino DefineConstants são computados em um Target, não durante a avaliação do MSBuild. Como resultado, Condition atributos que inspecionam DefineConstants valores relacionados a TFM são avaliados antes que esses valores sejam definidos e não disparam mais conforme o esperado.

Por exemplo, a seguinte condição não é mais avaliada corretamente porque NET9_0_OR_GREATER não está presente no DefineConstants momento da avaliação:

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

Tipo de mudança disruptiva

Essa alteração é uma mudança comportamental.

Razão da alteração

O acesso direto ou a manipulação de DefineConstants levou a usuários substituírem acidentalmente os valores. Além disso, mover a computação para um Target permite cenários de orquestração do MSBuild mais complexos exigidos por outras ferramentas.

  • Não inspecioneDefineConstants valores relacionados a TFM (por exemplo, NET9_0_OR_GREATER e NETSTANDARD2_0 similares) em atributos MSBuild Condition no momento da avaliação.

  • Certifique-se de usar as funções documentadas do MSBuild TargetFramework e TargetPlatform para verificar a compatibilidade do framework de destino. Por exemplo:

    <!-- 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>
    
  • Continue a usar DefineConstants em Condition atributos para constantes que você define e controla a si mesmo. Essa alteração afeta apenas as constantes relacionadas ao TFM que o SDK define automaticamente.

APIs afetadas

Nenhum.