C#のフレームワークバージョンに応じた条件付きコンパイル
-
03-07-2019 - |
質問
次のようなものを許可するプリプロセッサシンボルはありますか
#if CLR_AT_LEAST_3.5
// use ReaderWriterLockSlim
#else
// use ReaderWriterLock
#endif
またはこれを行う他の方法
解決
定義済みの「プリプロセッサ」シンボルはないと思います。ただし、次のように目的を達成できます。
-
サポートするCLRのバージョンごとに1つずつ、プロジェクトのさまざまな構成を作成します。
-
CLRバージョンごとに
VERSION2
、VERSION3
などの記号を選択します。 -
すべての構成で、それに関連付けられた1つのシンボルを定義し、他のすべてのシンボルの定義を解除します。
-
条件付きコンパイルブロックでこれらのシンボルを使用します。
他のヒント
組み込みのものはありませんが、独自のものを提供できます。
この特定のシナリオでは、すべてのコードに #if
が散らばらないように、ロジックを(たとえば)ラッパー(ロック)クラスにカプセル化することができます。もちろん、ちょっとしたロックだけをしているのなら、それだけの価値はないかもしれません。
さまざまな構成および/またはプロジェクトを使用して、さまざまなプラットフォーム向けにビルドします- protobuf- net は、このトリックを使用して.NET 2.0、.NET 3.0、mono、CF 2.0、CF 3.5用にビルドします。コードには、ロジックを制御するためのさまざまなシンボルに基づいた #if
ブロックがあります。たとえば、 BinaryFormatter
はCFでは使用できません。 WCF
は.NET 3.0でのみ使用可能、 Delegate.CreateDelegate
はCF 2.0などにはありません。
(プリプロセッサを使用する代わりに)リフレクションを使用して、ReaderWriterLockSlimなどの特定のタイプが使用可能かどうかを動的に確認できます。
これにより、製品の単一バージョンを展開できるという利点が得られ、.NET 3.5を使用している(または更新している)ユーザーは最適化されたコードの恩恵を受けることができます。
/ defineコンパイラスイッチを使用して、このシンボルを手動で設定できます。次に、目的のclrバージョンごとに異なるビルド構成を作成します。
これで十分な場合は、Environment.Versionを使用できますが、 divoのソリューションのフレームワークバージョンに依存していますが、不要なコードが多く残っているようです。