我创建了一个多目标框架项目。我使用类似这样的东西:
#if NET40
Console.WriteLine("Hello from .NET Core 4");
#endif
但我找不到.NET Core的通配符。我尝试过:
#if NETCOREAPP1.0
Console.WriteLine("Hello from .NET Core");
#endif
但这句话并不是有效的陈述。
我创建了一个多目标框架项目。我使用类似这样的东西:
#if NET40
Console.WriteLine("Hello from .NET Core 4");
#endif
但我找不到.NET Core的通配符。我尝试过:
#if NETCOREAPP1.0
Console.WriteLine("Hello from .NET Core");
#endif
但这句话并不是有效的陈述。
_
代替点号:
NETCOREAPP1_0
或更近期的 NETCOREAPP1_1
和 NETCOREAPP2_0
SDK 风格项目中的目标框架文档列出了不同预处理器符号的列表。
NETFRAMEWORK, NET48, NET472, NET471, NET47, NET462, NET461, NET46, NET452, NET451, NET45, NET40, NET35, NET20
NETSTANDARD, NETSTANDARD2_1, NETSTANDARD2_0, NETSTANDARD1_6, NETSTANDARD1_5, NETSTANDARD1_4, NETSTANDARD1_3, NETSTANDARD1_2, NETSTANDARD1_1, NETSTANDARD1_0
NET, NET6_0, NET6_0_ANDROID, NET6_0_IOS, NET6_0_MACOS, NET6_0_MACCATALYST, NET6_0_TVOS, NET6_0_WINDOWS, NET5_0, NETCOREAPP, NETCOREAPP3_1, NETCOREAPP3_0, NETCOREAPP2_2, NETCOREAPP2_1, NETCOREAPP2_0, NETCOREAPP1_1, NETCOREAPP1_0
对于 Mono,您通常可以使用您的版本已知的 NetFramework 版本。例如,Mono 6.12 包括从 2.0 到 4.8 的所有 NetFramework 版本。但是,如果您必须识别 Mono 本身,则应定义 MONO
和 __MonoCS__
。
NETCOREAPP
和NETSTANDARD
而无需指定其版本号。我测试过,在VS2019中可以正常工作。 - Mahdi Ataollahi对于Visual Studio 2017的.csproj文件拓展自Devon的回答:
查看这里的表格,你可以通过正则表达式轻松定义常量。因此,如果添加/更改目标框架,您无需考虑更新条件。
<PropertyGroup Condition="$([System.Text.RegularExpressions.Regex]::IsMatch('$(TargetFramework)', '^net\d'))">
<DefineConstants>NETFRAMEWORK</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition="$([System.Text.RegularExpressions.Regex]::IsMatch('$(TargetFramework)', '^netstandard\d'))">
<DefineConstants>NETSTANDARD</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition="$([System.Text.RegularExpressions.Regex]::IsMatch('$(TargetFramework)', '^netcoreapp\d'))">
<DefineConstants>NETCORE</DefineConstants>
</PropertyGroup>
使用说明:
#if NETFRAMEWORK
FrameworkSpecific();
#endif
#if NETSTANDARD
StandardSpecific();
#endif
#if NETCORE
CoreSpecific();
#endif
NETCOREAPP
)。 - FunctorSalad您可以按照以下方式(project.json)定义任何自定义条件编译符号:
"frameworks": {
"net40": {
"buildOptions": {
"define": ["NET_40"]
}
},
"netstandard1.5": {
"buildOptions": {
"define": [ "NET_STANDARD" ]
}
}
}
这种方法似乎更实用,因为您可以针对多个目标使用相同的条件符号,而无需编写类似以下的内容:
这种方法看起来更切实可行,因为您可以使用同一个条件符号来匹配多个目标,而不需要编写像以下这样的内容:
#if NET20 && NET 40 && NET45
<PropertyGroup Condition="'$(TargetFramework)' == 'net451' Or '$(TargetFramework)' == 'net461' ">
<DefineConstants>FULLFRAMEWORK;FULL</DefineConstants>
</PropertyGroup>
然后您可以在 #if
编译器指令中这样使用它:
#if FULLFRAMEWORK
private bool DoSomethingFullFrameworkSpecific()
{
var connectionStringSetting = ConfigurationManager.ConnectionStrings[connectionStringName];
return connectionStringSetting != null;
}
#endif
#if NETCOREAPP1_0
- Kiran_
替换.
。 - MartinHN