2011-07-04 9 views
7

私のシナリオ: 例外が発生したコードのログファイル(例えば、例外が発生した行の5行前と5行、または少なくともそのメソッドのすべてのコード)を書きたいとします。pdbをデコンパイルしてC#のソースコードを取得する方法は?

私の考えは、C#コードでpdbファイルを逆コンパイルし、その逆コンパイルされたファイルからcatchブロックで例外となったメソッドを見つけ出すことです。

Pbdファイルが存在し、私のアプリケーションがデバッグバージョンとしてビルドされています。 GUI(例えばReflector)を使って逆コンパイルを行うツールがあることは知っていますが、私のコードからその機能を使いたいと思っています。

どうすればよいですか?

+0

CLRはすでに.pdbファイルを使用しています。これが、例外のStackTraceでソースコードと行番号の注釈を生成します。差異を確認するために.pdbファイルを使用せずに取得したスタックトレースと比較してください。可能なことは、それ以上のことを探すことには意味がありません。 –

答えて

2

ILSpyのソースコードを参照してください。これはReflectorのためのオープンソースの代替手段です。

特に、ライブラリMono.CecilMono.Cecil.Pdbを使用しています。私は後者があなたのやりたいことを手伝ってくれると思う。

関連するコード部分は、許可されたライセンスであるMITライセンスを使用しています。

+0

ILSpyを避け、反射板を使用してください。あなたはいくつかの問題を解決します。 –

+1

@BartoszWójcikなぜ 'Mono.Cecil.Pdb'を使うのが良い選択ではないか説明してください。 – CodesInChaos

+0

de4dotが.NETの操作のためにMono.Cecilを放棄したのと同じ理由で、あなたの事実をまっすぐにします。 –

3

PDBには、MSILとソースファイル名/行番号の間のマッピングが含まれています。これは、元のソースファイルに戻って見ることができるときに最も便利です。なぜなら、逆コンパイルでは一般的に行番号が保持されないからです(PDBファイルを使用した場合でも可能です)。記号名(PDBにも格納されています)はしばしば近いものですが、確かに書かれたとおりに元のコードを復元することはありません。

0

使用反射法を実行するソースコードを取得する:System.Reflection.MethodBase.GetCurrentMethod().GetMethodBody();

あなたはMethodBaseメンバーを使用して得ることができる情報の多様性があります:http://msdn.microsoft.com/en-us/library/system.reflection.methodbase_methods.aspx

はまたMethodBase情報を取得するために、いくつかの良い例はこちらで探します例外処理中:http://msdn.microsoft.com/en-us/library/system.reflection.methodbase.getmethodbody.aspx#Y563

+0

GetMethodBody()メソッドのソースコードを見ることができません。 – Bero

関連する問題