web-dev-qa-db-ja.com

コンパイル用の#ifステートメントで.NET Coreを設定する方法

マルチターゲットフレームワークプロジェクトを作成しました。私はこのようなものを使用します:

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

しかし、.NET Coreのワイルドカードは見つかりません。私は試した :

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

しかし、それは有効なステートメントではありません。ありがとう。

28
Serhii Shemshur

アンダースコアが必要です_ポイントの代わりに:

NETCOREAPP1_0または最新のNETCOREAPP1_1およびNETCOREAPP2_0

記事 https://docs.Microsoft.com/en-us/dotnet/articles/core/tutorials/libraries には、さまざまなプリプロセッサシンボルのリストが含まれています。

.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

VS2017 .csprojファイルに対するDevonの回答の拡張:

here の表を見ると、正規表現を使用して簡単に定数を定義できます。したがって、ターゲットフレームワークが追加/変更された場合、条件の更新について考える必要はありません。

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

使用法:

#if NETFRAMEWORK
    FrameworkSpecific();
#endif

#if NETSTANDARD
    StandardSpecific();
#endif

#if NETCORE
    CoreSpecific();
#endif
21
Chris

カスタム条件付きコンパイルシンボルは、次の方法で定義できます(project.json)。

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

    }
}

このアプローチは、次のような記述を必要とせずに、複数のターゲットに同じ条件シンボルを使用できるため、より実用的と思われます。

#if NET20 && NET 40 && NET45
11

新しいVisual Studio 2017 csprojプロジェクトシステムの場合...

利用可能なシンボルの完全なリストは、ここで見つけることができます: https://docs.Microsoft.com/en-us/dotnet/core/tutorials/libraries#how-to-multitarget

次のように、.csprojファイルに複合定数を作成できます。

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

その後、次のように#ifコンパイラ指令で使用できます。

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

上記の答えは正しいですが、.NET Core xprojプロジェクトタイプにはバグがあることに注意してください。プロジェクト設定で条件付きコンパイルシンボルを定義すると、要素は「定義」として定義されますが、これは正しくありません。 「define」という要素を作成する必要があります。 project.jsonを手動で編集することで問題を回避できます。

このバグをマイクロソフトで2か所で記録しました。迷惑をMicrosoftに登録して、最終的には修正して、他の人にこの悲しみを引き起こさないようにしてください。

このスレッドには、再現手順とスクリーンショットに関する問題の詳細な説明があります: https://github.com/dotnet/cli/issues/4022#issuecomment-238777946

これはMicrosoft Connectのバグレポートです。 https://connect.Microsoft.com/VisualStudio/feedbackdetail/view/2983351/conditional-compilation-symbols-broken-in-net-core-projects#tabs

2