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