25

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

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

またはこれを行う他の方法はありますか?

4

5 に答える 5

21

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

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

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

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

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

于 2009-01-03T11:10:11.213 に答える
6

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

この特定のシナリオでは、ロジックを (たとえば) ラッパー (ロック) クラスにカプセル化して、#ifすべてのコードに散らばらないようにすることができます。もちろん、ロックを少しだけ行う場合は、手間をかける価値はないかもしれません。

さまざまな構成やプロジェクトを使用して、さまざまなプラットフォーム用にビルドします。つまり、このトリックを使用して、.NET 2.0、.NET 3.0、mono、CF 2.0、CF 3.5 用の protobuf-netビルドを作成します。コードには#if、ロジックを制御するさまざまなシンボルに基づくブロックがあります。たとえば、BinaryFormatterCF では使用できないWCF、.NET 3.0 でのみ使用可能、Delegate.CreateDelegateCF 2.0 では使用できないなどです。

于 2009-01-03T11:24:38.063 に答える
4

リフレクションを使用して、(プリプロセッサを使用する代わりに) ReaderWriterLockSlim のような特定の型が使用可能かどうかを動的に確認できます。

これにより、製品の単一バージョンをデプロイできるという利点が得られ、.NET 3.5 を使用している (または .NET 3.5 に更新している) ユーザーは最適化されたコードの恩恵を受けることができます。

于 2009-01-03T11:13:55.340 に答える
2

/define コンパイラ スイッチを使用して、このシンボルを手動で設定できます。次に、目的の clr バージョンごとに異なるビルド構成を作成します。

于 2009-01-03T11:10:48.030 に答える
1

それだけならEnvironment.Versionを使えばいいと思いますが、 divo のソリューションと同様に、不要なコードがたくさん残っているようです。

于 2009-01-04T17:04:53.367 に答える