マルチターゲットフレームワークプロジェクトを作成しました。私はこのようなものを使用します:
#if NET40
Console.WriteLine("hello from net 4");
#endif
しかし、.NET Coreのワイルドカードは見つかりません。私は試した :
#if NETCOREAPP1.0
Console.WriteLine("hello from net Core");
#endif
しかし、それは有効なステートメントではありません。ありがとう。
アンダースコアが必要です_
ポイントの代わりに:
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
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
カスタム条件付きコンパイルシンボルは、次の方法で定義できます(project.json)。
"frameworks": {
"net40": {
"buildOptions": {
"define": ["NET_40"]
}
},
"netstandard1.5": {
"buildOptions": {
"define": [ "NET_STANDARD" ]
}
}
}
このアプローチは、次のような記述を必要とせずに、複数のターゲットに同じ条件シンボルを使用できるため、より実用的と思われます。
#if NET20 && NET 40 && NET45
新しい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
上記の答えは正しいですが、.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