With the new MsBuild version it's really easy to target multiple frameworks and framework versions in .csproj project:
<TargetFrameworks>net40;net45;net461;netcoreapp1.1</TargetFrameworks>
Now, how do I get a constant defined for each of them so that I can have certain code only be part of e.g. netcoreapp1.1 pass and not full framework compilation?
I'd like to be able to add a preprocessor directive like this one:
#if NET_CORE
    // some code
#endif
And the same for full .NET Framework and possibly .NET Standard.
The other questions I found don't take new <TargetFrameworks> way of defining the framework into accounts. Stuff like this doesn't work:
<DefineConstants Condition=" '$(TargetFramework)' == '.NETCoreApp' ">NET_CORE</DefineConstants>
                There are already various preprocessor symbols defined that you can use. From the docs:
| Framework/Version | Symbol | 
|---|---|
| .NET Framework (any version) | NETFRAMEWORK | 
| .NET Framework 2.0 | NET20 | 
| .NET Framework 3.5 | NET35 | 
| .NET Framework 4.0 | NET40 | 
| .NET Framework 4.5 | NET45 | 
| .NET Framework 4.5.1 | NET451 | 
| .NET Framework 4.5.2 | NET452 | 
| .NET Framework 4.6 | NET46 | 
| .NET Framework 4.6.1 | NET461 | 
| .NET Framework 4.6.2 | NET462 | 
| .NET Framework 4.7 | NET47 | 
| .NET Framework 4.7.1 | NET471 | 
| .NET Framework 4.7.2 | NET472 | 
| .NET Framework 4.8 | NET48 | 
| Framework/Version | Symbol | 
|---|---|
| .NET Standard (any version) | NETSTANDARD | 
| .NET Standard 1.0 | NETSTANDARD1_0 | 
| .NET Standard 1.1 | NETSTANDARD1_1 | 
| .NET Standard 1.2 | NETSTANDARD1_2 | 
| .NET Standard 1.3 | NETSTANDARD1_3 | 
| .NET Standard 1.4 | NETSTANDARD1_4 | 
| .NET Standard 1.5 | NETSTANDARD1_5 | 
| .NET Standard 1.6 | NETSTANDARD1_6 | 
| .NET Standard 2.0 | NETSTANDARD2_0 | 
| .NET Standard 2.1 | NETSTANDARD2_1 | 
| Framework/Version | Symbol | 
|---|---|
| .NET [Core] (any version) | NETCOREAPP | 
| .NET Core 1.0 | NETCOREAPP1_0 | 
| .NET Core 1.1 | NETCOREAPP1_1 | 
| .NET Core 2.0 | NETCOREAPP2_0 | 
| .NET Core 2.1 | NETCOREAPP2_1 | 
| .NET Core 2.2 | NETCOREAPP2_2 | 
| .NET Core 3.0 | NETCOREAPP3_0 | 
| .NET Core 3.1 | NETCOREAPP3_1 | 
| Framework/Version | Symbol | 
|---|---|
| .NET 5.0 | NET5_0 | 
<framework>_OR_GREATER SymbolsFrom the release of .NET6, a suite of <framework>_OR_GREATER symbols were added:
For example:
| Target Framework | Symbols | 
|---|---|
| .NET Framework | 
NET48_OR_GREATER, NET472_OR_GREATER, NET471_OR_GREATER, NET47_OR_GREATER, NET462_OR_GREATER, NET461_OR_GREATER, NET46_OR_GREATER, NET452_OR_GREATER, NET451_OR_GREATER, NET45_OR_GREATER, NET40_OR_GREATER, NET35_OR_GREATER, NET20_OR_GREATER
 | 
| .NET Standard | 
NETSTANDARD2_1_OR_GREATER, NETSTANDARD2_0_OR_GREATER, NETSTANDARD1_6_OR_GREATER, NETSTANDARD1_5_OR_GREATER, NETSTANDARD1_4_OR_GREATER, NETSTANDARD1_3_OR_GREATER, NETSTANDARD1_2_OR_GREATER, NETSTANDARD1_1_OR_GREATER, NETSTANDARD1_0_OR_GREATER
 | 
| .NET 5+ (and .NET Core) | 
NET6_0_OR_GREATER, NET6_0_ANDROID_OR_GREATER, NET6_0_IOS_OR_GREATER, NET6_0_MACOS_OR_GREATER, NET6_0_MACCATALYST_OR_GREATER, NET6_0_TVOS_OR_GREATER, NET6_0_WINDOWS_OR_GREATER, NET5_0_OR_GREATER, NETCOREAPP_OR_GREATER, NETCOREAPP3_1_OR_GREATER, NETCOREAPP3_0_OR_GREATER, NETCOREAPP2_2_OR_GREATER, NETCOREAPP2_1_OR_GREATER, NETCOREAPP2_0_OR_GREATER, NETCOREAPP1_1_OR_GREATER, NETCOREAPP1_0_OR_GREATER
 | 
#if NETSTANDARD1_6
    Console.WriteLine("This is .Net Standard 1.6");
#endif
#if NETCOREAPP2_0
    Console.WriteLine("This is .Net Core 2.0");
#endif
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With