2

最近、コンパイル時に、a) 特定のアセンブリ参照が存在し、正常に解決できるかどうか、または b) 特定のクラス (完全修飾名がわかっている) が定義されているかどうかを確認する必要があることがわかりました。これら 2 つの状況は、私の目的では同等であるため、いずれかを確認できれば十分です。.NET/C# でこれを行う方法はありますか? プリプロセッサ ディレクティブは、最初は役に立つかもしれないと思いましたが、必要な機能を備えていないようです。

もちろん、実行時に型の存在を確認することは簡単にできますが、残念ながら、この状況での特定の問題は解決しません。(特定の参照が欠落しているという事実を無視して、コード内の別のアプローチにフォールバックできるようにする必要があります。)

4

3 に答える 3

1

コンパイラにコードの 1 つのブランチを無視させたいようですが、これは実際には #if ブロックの後ろに隠すことによってのみ実行できます。コンパイラ定数を定義して #if を使用すると、目的にかなうでしょうか?

#if MyConstant
.... code here that uses the type ....
#else
.... workaround code ....
#endif

別のオプションは、コンパイル時に他のクラスにまったく依存せず、リフレクションまたは .NET 4.0 動的キーワードを使用してそれを使用することです。.NET 3.5 以前のパフォーマンス クリティカルなシナリオで繰り返し呼び出される場合は、DynamicMethod を使用して、毎回リフレクションを使用する代わりに、最初の使用時にコードをビルドできます。

于 2009-06-04T23:02:02.270 に答える
1

参照を追加してから、アセンブリの型で typeof 式を使用して、それが使用可能であることを確認できない理由はありますか?

var x = typeof(SomeTypeInSomeAssembly);

SomeTypeInSomeAssembly を含むアセンブリが参照されておらず、利用できない場合、これはコンパイルされません。

于 2009-06-04T22:52:28.500 に答える
1

私が最初に望んでいたものとは正確ではありませんが、ここで解決策を見つけたようです。

私の解決策:

私が最終的に行ったことは、新しいビルド構成を作成してから、参照を使用するか、代替の (動作が保証された) アプローチにフォールバックするかを決定するためにコードで使用したプリコンパイラ定数を定義することです。完全に自動化されているわけではありませんが、比較的シンプルで非常にエレガントに見えます。私の目的には十分です。

別:

これを完全に自動化したい場合は、バッチ スクリプト/小さなプログラムを実行してマシン上の特定の参照の可用性をチェックし、プリコンパイラ定数を含むファイルを更新するビルド前コマンドを使用して実行できます。ただし、解決する必要がある複数の独立した参照がある場合はより便利だったかもしれませんが、これは価値があるよりも多くの労力を費やすと考えました (可用性を確認してください)。

于 2009-06-05T21:59:54.287 に答える