我的場景: 我想在日誌文件中發生異常事件的代碼部分(例如發生異常的前5行和後5行 - 或者至少是該方法的所有代碼)。如何反編譯pdb以獲取C#源代碼?
我的想法是反編譯C#代碼中的pdb文件,並從那個反編譯的文件中找到catch塊中發生異常的方法。
Pbd文件存在,我的應用程序構建爲調試版本。我知道有些工具可以通過它的GUI(例如Reflector)進行反編譯,但我想從我的代碼中獲得這些功能。
怎麼辦?
我的場景: 我想在日誌文件中發生異常事件的代碼部分(例如發生異常的前5行和後5行 - 或者至少是該方法的所有代碼)。如何反編譯pdb以獲取C#源代碼?
我的想法是反編譯C#代碼中的pdb文件,並從那個反編譯的文件中找到catch塊中發生異常的方法。
Pbd文件存在,我的應用程序構建爲調試版本。我知道有些工具可以通過它的GUI(例如Reflector)進行反編譯,但我想從我的代碼中獲得這些功能。
怎麼辦?
查看ILSpy的源代碼。這是Reflector的開源替代品。
特別是它使用庫Mono.Cecil
和Mono.Cecil.Pdb
。我懷疑後者可以幫助你做你想做的事情。
相關的代碼部分使用MIT許可證,這是一個許可許可證。
請避免使用ILSpy並使用Reflector,您將爲自己節省一些問題。 –
@BartoszWójcik您能否解釋一下爲什麼使用'Mono.Cecil.Pdb'不是一個好選擇? – CodesInChaos
de4dot放棄了用於.NET操作的Mono.Cecil的相同原因,直接瞭解您的事實。 –
PDB包含MSIL和源文件名/行號之間的映射。當您可以返回查看原始源文件時,這是非常有用的,因爲反編譯通常不會保留行號(儘管如果它也可以使用PDB文件)。它當然不會完全恢復原來的代碼,儘管使用符號名稱(也存儲在PDB中)通常會接近。
使用反射來獲取執行方法的源代碼: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
GetMethodBody()不允許我查看方法的源代碼。 – Bero
CLR已經使用.pdb文件。這就是在異常的StackTrace中生成源代碼和行號註釋的原因。與沒有.pdb文件的堆棧跟蹤相比,可以看到差異。尋找更多信息毫無意義,這是可能的。 –