web-dev-qa-db-fra.com

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

J'ai créé un projet cadre multi-ciblé. J'utilise quelque chose comme ça:

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

Mais je ne peux pas trouver de caractères génériques 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.

28
Serhii Shemshur

Vous avez besoin de souligner _ au lieu du point:

NETCOREAPP1_0 ou la plus récente NETCOREAPP1_1 et NETCOREAPP2_0

L'article https://docs.Microsoft.com/en-us/dotnet/articles/core/tutorials/libraries comprend une liste pour les 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

42
Ralf Bönning

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

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

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

Usage:

#if NETFRAMEWORK
    FrameworkSpecific();
#endif

#if NETSTANDARD
    StandardSpecific();
#endif

#if NETCORE
    CoreSpecific();
#endif
21
Chris

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 être plus pratique car vous pouvez utiliser le même symbole conditionnel pour plusieurs cibles, sans avoir besoin d'écrire quelque chose comme

#if NET20 && NET 40 && NET45
11
Vitaliy Fedorchenko

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 des constantes composites pour votre fichier .csproj comme ceci:

  <PropertyGroup Condition="'$(TargetFramework)' == 'net451' Or '$(TargetFramework)' == 'net461' ">
    <DefineConstants>FULLFRAMEWORK;FULL</DefineConstants>
  </PropertyGroup>

Ensuite, vous pouvez l'utiliser dans un #if directive du compilateur comme ceci:

#if FULLFRAMEWORK
        private bool DoSomethingFullFrameworkSpecific()
        {
            var connectionStringSetting = ConfigurationManager.ConnectionStrings[connectionStringName];
            return connectionStringSetting != null;
        }
#endif
5
Devon Burriss

Bien que la réponse au-dessus de celle-ci 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 via les paramètres du projet, il définit l'élément comme "définit", mais cela est incorrect. Il doit créer un élément appelé "définir". Vous pouvez contourner le problème en modifiant manuellement le fichier project.json.

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

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

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

2
Melbourne Developer