.NET6中如何通过预编译指令判断net6.0-windows目标框架?
区分net6.0与net6.0-windows的预编译判断方案
当项目.csproj中配置了<TargetFrameworks>netstandard2.0;net6.0;net6.0-windows</TargetFrameworks>时,默认的NET6_0预编译符号会同时匹配net6.0和net6.0-windows目标框架,无法直接区分两者,可通过以下两种方案解决:
方案一:自定义预编译符号
在.csproj文件中,为net6.0-windows目标框架单独添加自定义预编译常量,实现精准判断:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFrameworks>netstandard2.0;net6.0;net6.0-windows</TargetFrameworks> </PropertyGroup> <!-- 为net6.0-windows添加专属预编译符号 --> <PropertyGroup Condition="'$(TargetFramework)' == 'net6.0-windows'"> <DefineConstants>$(DefineConstants);NET6_0_WINDOWS</DefineConstants> </PropertyGroup> </Project>
之后在C#代码中即可这样区分:
#if NETSTANDARD2_0 // 仅.NET Standard 2.0执行的代码 #elif NET6_0 && !NET6_0_WINDOWS // 仅纯net6.0执行的代码 #elif NET6_0_WINDOWS // 仅net6.0-windows执行的代码 #endif
方案二:利用MSBuild自带的WINDOWS符号
net6.0-windows目标框架会自动触发MSBuild定义WINDOWS预编译符号,结合NET6_0符号即可精准定位net6.0-windows,无需修改.csproj:
#if NETSTANDARD2_0 // 仅.NET Standard 2.0执行的代码 #elif NET6_0 && !WINDOWS // 仅纯net6.0执行的代码 #elif NET6_0 && WINDOWS // 仅net6.0-windows执行的代码 #endif
两种方案对比:
- 自定义符号(方案一)更清晰明确,不会和其他Windows相关目标框架(如net5.0-windows)混淆,适合需精准区分特定版本Windows框架的场景。
- 利用自带符号(方案二)更简洁,无需调整项目配置,但如果后续扩展其他Windows版本目标框架,需额外修改判断逻辑。
内容的提问来源于stack exchange,提问作者monty
相关产品推荐
相关产品推荐

