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