Ich habe ein multi-zielgerichtetes Rahmenprojekt erstellt. Ich benutze so etwas:
#if NET40
Console.WriteLine("hello from net 4");
#endif
Aber ich kann Platzhalter für .NET Core nicht finden. Ich habe es versucht :
#if NETCOREAPP1.0
Console.WriteLine("hello from net Core");
#endif
aber es ist keine gültige Aussage. Vielen Dank.
Du brauchst einen Unterstrich _
anstelle von point:
NETCOREAPP1_0
oder der neuere NETCOREAPP1_1
und NETCOREAPP2_0
Der Artikel https://docs.Microsoft.com/en-us/dotnet/articles/core/tutorials/libraries enthält eine Liste der verschiedenen Präprozessorsymbole.
.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
Erweiterung der Devon-Antwort für VS2017-csproj-Dateien:
In der Tabelle hier können Sie Konstanten einfach mit regulären Ausdrücken definieren. Sie müssen also nicht über die Aktualisierung der Bedingungen nachdenken, wenn Ziel-Frameworks hinzugefügt/geändert werden.
<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>
Verwendung:
#if NETFRAMEWORK
FrameworkSpecific();
#endif
#if NETSTANDARD
StandardSpecific();
#endif
#if NETCORE
CoreSpecific();
#endif
Sie können benutzerdefinierte bedingte Kompilierungssymbole wie folgt definieren (project.json):
"frameworks": {
"net40": {
"buildOptions": {
"define": ["NET_40"]
}
},
"netstandard1.5": {
"buildOptions": {
"define": [ "NET_STANDARD" ]
}
}
}
Dieser Ansatz scheint praktischer zu sein, da Sie das gleiche bedingte Symbol für mehrere Ziele verwenden können, ohne etwas wie schreiben zu müssen
#if NET20 && NET 40 && NET45
Für das neue Projektsystem Visual Studio 2017 csproj ...
Die vollständige Liste der verfügbaren Symbole finden Sie hier: https://docs.Microsoft.com/en-us/dotnet/core/tutorials/libraries#how-to-multitarget
Sie können zusammengesetzte Konstanten für in Ihrer .csproj-Datei wie folgt erstellen:
<PropertyGroup Condition="'$(TargetFramework)' == 'net451' Or '$(TargetFramework)' == 'net461' ">
<DefineConstants>FULLFRAMEWORK;FULL</DefineConstants>
</PropertyGroup>
Dann können Sie es in einem #if
Compiler-Direktive wie folgt:
#if FULLFRAMEWORK
private bool DoSomethingFullFrameworkSpecific()
{
var connectionStringSetting = ConfigurationManager.ConnectionStrings[connectionStringName];
return connectionStringSetting != null;
}
#endif
Obwohl die Antwort über dieser richtig ist, sollte beachtet werden, dass es einen Fehler im .NET Core xproj-Projekttyp gibt. Wenn Sie über die Projekteinstellungen ein Symbol für eine bedingte Kompilierung definieren, wird das Element als "defined" definiert, dies ist jedoch nicht korrekt. Es sollte ein Element namens "define" erstellen. Sie können das Problem umgehen, indem Sie die Datei project.json manuell bearbeiten.
Ich habe diesen Fehler an zwei Stellen bei Microsoft protokolliert. Nehmen Sie sich bitte die Zeit, um Ihren Ärger bei Microsoft zu registrieren, damit diese eventuell Abhilfe schaffen und diese Trauer für andere nicht verursachen.
In diesem Thread finden Sie eine ausführliche Erläuterung des Problems mit Schritten zur erneuten Wiedergabe sowie Screenshots: https://github.com/dotnet/cli/issues/4022#issuecomment-238777946
Dies ist der Microsoft Connect-Fehlerbericht: https://connect.Microsoft.com/VisualStudio/feedbackdetail/view/2983351/conditional-compilation-symbols-broken-in-net-core-projects#tabs