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