2009-05-25 11 views
1

'.cs'ファイルで利用可能なクラスを取得する方法。アセンブリ内のクラスとメソッドを取得するために、C#でリフレクションを使用して.csファイルからクラスとメソッドを取得する方法。

Assembly.GetTypes() and Type.GetMethods() 

を使用してアセンブリ内のクラスとメソッドを取得することができます。

同様に、C#ファイル(.csファイル)内に存在するすべてのクラスを取得する方法。?私は簡単にそれら内の方法およびメソッドのパラメータなどの詳細を取得することができ、そこからは.csファイルでクラスなど

答えて

3

C#のパーサを使用してのショートを取得する必要があり、の直接的な方法はありませんしている。 .csファイルをCSharpCodeProvider(ファイルが独自にコンパイルされ、参照されているすべてのアセンブリをコンパイラに伝えることができる場合にのみ動作します)を使用してコンパイルし、生成されたアセンブリに対してリフレクションを使用できます。

+0

しかし、私のプロジェクトが複数の.csファイルに分割され、それらのすべてをコンパイルするだけで私にアセンブリが提供される場合はどうなりますか?私は実際に個々の.csファイルが必要です。 – SyncMaster

+0

私は、半永久的なC#プログラム(Visual Studioのように、不完全なC#ソースを持つもの)からこれらのデータを取得するためにC#パーサを使うべきだと思います。 –

0

コンパイラは、コンパイル時にコードファイルからすべての概念を削除します。おそらく、アセンブリで使用可能なデバッグシンボルから必要な情報を取得することは可能です。

0

あなたはいつもあなたは反射が動作するために必要なアプリケーションをコンパイルするときは、必ずしかし

obj.GetType() 

を呼び出すことができます

this.GetType() 

またはクラスの外を呼び出すことができるクラスで持つから、あなたはもはやファイルでその定義を得ることができません。

0

これまでは、C#コンパイラを呼び出し、C#ファイルをコンパイルし、出力された型に対してリフレクションを使用してこれを行いました。これは、C#ファイルがスタンドアロンファイルであり、依存関係を持たない場合に可能です。

ただし、正しい方法はパーサーを使用することです。これは簡単ではありません。いくつかのオプションが用意されています.MinosseCCの1つです。

ちなみに、C#5.0では、Stringをコンパイルして実行可能なコードを取得することができるため、オンザフライでコードを簡単にコンパイルできます。これを待つことはできません - 私のコードを読んでいる人はすべて混乱するでしょう。

1

パーザ生成ツールを使用してクイックC#パーサーを生成することをお勧めします。Antlrを使用できます。

また、あなたはすべてのthisthis

0

ファーストをチェックすることができ、クラスが定義されているは.csファイルのようなものはありません。クラスには部分的なマークを付けることができ、パーツは複数の.csファイルで定義できます。

デバッグ情報を使用してコンパイルすると、各メソッドのファイル名はアセンブリに残ります(ソースファイルの各行について、対応するILコマンドにタグが付けられます)。

残念ながら、(アセンブリファイルを手動で解析することなく)実行中のアプリケーションからその情報に簡単にアクセスする方法はわかりません。

メソッドを呼び出すことができれば、呼び出すことができますし、スタックトレース(別のスレッドから)を構築することができます - StackFrameオブジェクトには元のファイル名があります。しかし、これは遅いです(ファイル名が異なることを見つけるためにすべてのメソッドを呼び出す必要があるため)、また、メソッドがあなたのハードドライブをフォーマットする場合はどうでしょうか?

したがって、AntLRのようなパーサで.csファイルを解析しようとする唯一の方法があります。

関連する問題