2011-07-04 39 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並使用Reflector,您將爲自己節省一些問題。 –

+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