質問

次のようなものを許可するプリプロセッサシンボルはありますか

#if CLR_AT_LEAST_3.5
// use ReaderWriterLockSlim
#else
// use ReaderWriterLock
#endif

またはこれを行う他の方法

役に立ちましたか?

解決

定義済みの「プリプロセッサ」シンボルはないと思います。ただし、次のように目的を達成できます。

  1. サポートするCLRのバージョンごとに1つずつ、プロジェクトのさまざまな構成を作成します。

  2. CLRバージョンごとに VERSION2 VERSION3 などの記号を選択します。

  3. すべての構成で、それに関連付けられた1つのシンボルを定義し、他のすべてのシンボルの定義を解除します。

  4. 条件付きコンパイルブロックでこれらのシンボルを使用します。

他のヒント

組み込みのものはありませんが、独自のものを提供できます。

この特定のシナリオでは、すべてのコードに #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のソリューションのフレームワークバージョンに依存していますが、不要なコードが多く残っているようです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top