wake-up-neo.com

So legen Sie .NET Core in der # if-Anweisung für die Kompilierung fest

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.

28
Serhii Shemshur

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

42
Ralf Bönning

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

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
11

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
5
Devon Burriss

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

2