Comment définir .NET Core dans une instruction #if pour la compilation

Je crée un projet de structure multy. J’utilise quelque chose comme ça:

#if NET40 Console.WriteLine("hello from net 4"); #endif 

Mais je ne trouve pas de joker pour .NET Core. J’ai essayé :

  #if NETCOREAPP1.0 Console.WriteLine("hello from net Core"); #endif 

mais ce n’est pas une déclaration valide. Merci.

Utilisez NETCOREAPP1_0 ou plus, NETCOREAPP1_1 et NETCOREAPP2_0

L’article https://docs.microsoft.com/en-us/dotnet/articles/core/tutorials/libraries inclut une liste des différents symboles de préprocesseur.

.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 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

Vous pouvez définir n’importe quel symbole de compilation conditionnelle personnalisé de la manière suivante (project.json):

 "frameworks": { "net40": { "buildOptions": { "define": ["NET_40"] } }, "netstandard1.5": { "buildOptions": { "define": [ "NET_STANDARD" ] } } } 

Cette approche semble plus pratique car vous pouvez utiliser le même symbole conditionnel pour plusieurs cibles sans avoir à écrire quelque chose comme

 #if NET20 && NET 40 && NET45 

Extension de la réponse de Devon pour les fichiers .csproj VS2017:

En regardant la table ici , vous pouvez facilement définir des constantes en utilisant des expressions régulières. Vous n’avez donc pas besoin de penser à la mise à jour des conditions si des frameworks cibles sont ajoutés / modifiés.

  NETFRAMEWORK   NETSTANDARD   NETCORE  

Usage:

 #if NETFRAMEWORK FrameworkSpecific(); #endif #if NETSTANDARD StandardSpecific(); #endif #if NETCORE CoreSpecific(); #endif 

Pour le nouveau système de projet Visual Studio 2017 csproj …

Vous pouvez trouver la liste complète des symboles disponibles ici: https://docs.microsoft.com/en-us/dotnet/core/tutorials/libraries#how-to-multitarget

Vous pouvez créer une ou plusieurs constantes composites dans votre fichier .csproj comme suit:

   FULLFRAMEWORK;FULL  

Ensuite, vous pouvez l’utiliser dans une directive de compilation #if comme ceci:

 #if FULLFRAMEWORK private bool DoSomethingFullFrameworkSpecific() { var connectionSsortingngSetting = ConfigurationManager.ConnectionSsortingngs[connectionSsortingngName]; return connectionSsortingngSetting != null; } #endif 

Bien que la réponse ci-dessus soit correcte, il convient de noter qu’il existe un bogue dans le type de projet .NET Core xproj. Lorsque vous définissez un symbole de compilation conditionnelle dans les parameters du projet, l’élément est défini comme “définit”, mais cela est incorrect. Il convient de créer un élément appelé “define”. Vous pouvez contourner le problème en modifiant manuellement le fichier project.json.

J’ai enregistré ce bogue avec Microsoft à deux endroits. Prenez le temps d’enregistrer votre désagrément auprès de Microsoft afin qu’ils finissent par résoudre le problème et ne causent pas ce chagrin à d’autres.

Ce fil a une explication détaillée du problème avec les étapes de la repro et des captures d’écran: https://github.com/dotnet/cli/issues/4022#issuecomment-238777946

Voici le rapport de bogue Microsoft Connect: https://connect.microsoft.com/VisualStudio/feedbackdetail/view/2983351/conditional-compilation-symbols-broken-in-net-core-projects#tabs