如何反编译pdb以获得C#源代码?

如何反编译pdb以获得C#源代码?,c#,.net,logging,pdb-files,decompiler,C#,.net,Logging,Pdb Files,Decompiler,我的设想: 我想在日志文件中写入发生异常的部分代码(例如,发生异常的前5行和后5行,或者至少是该方法的所有代码) 我的想法是用C#代码反编译pdb文件,然后从反编译的文件中找到catch块中出现异常的方法 Pbd文件存在,我的应用程序以调试版本生成。我知道有一些工具可以通过它的GUI(例如Reflector)进行反编译,但我想从我的代码中获得该功能 如何做?查看ILSpy的源代码。它是Reflector的开源替代方案 特别是它使用了库Mono.Cecil和Mono.Cecil.Pdb。我怀疑后者

我的设想: 我想在日志文件中写入发生异常的部分代码(例如,发生异常的前5行和后5行,或者至少是该方法的所有代码)

我的想法是用C#代码反编译pdb文件,然后从反编译的文件中找到catch块中出现异常的方法

Pbd文件存在,我的应用程序以调试版本生成。我知道有一些工具可以通过它的GUI(例如Reflector)进行反编译,但我想从我的代码中获得该功能


如何做?

查看ILSpy的源代码。它是Reflector的开源替代方案

特别是它使用了库
Mono.Cecil
Mono.Cecil.Pdb
。我怀疑后者能帮你做你想做的事


相关代码部分使用MIT许可证,这是一个许可证。

PDB包含MSIL和源文件名/行号之间的映射。当您可以返回并查看原始源文件时,这是最有用的,因为反编译通常不会保留行号(尽管如果还使用PDB文件,则可以保留行号)。它当然不能完全按照所写的方式恢复原始代码,尽管使用符号名(也存储在PDB中),它通常很接近。

使用反射获取执行方法的源代码:
System.reflection.MethodBase.GetCurrentMethod().GetMethodBody()

使用MethodBase成员可以获得多种信息:


在这里还可以找到一些在异常处理时获取MethodBase信息的好例子:

CLR已经使用了.pdb文件。这就是在异常的StackTrace中生成源代码和行号注释的原因。与没有.pdb文件的情况下得到的堆栈跟踪进行比较,以查看差异。没有必要寻找更多,这是可能的。GetMethodBody()不允许我查看该方法的源代码。请避免ILSpy并使用Reflector,您将为自己省下一些问题。@BartoszWójcik您能解释一下为什么使用
Mono.Cecil.Pdb
不是一个好选择吗?这与de4dot放弃Mono.Cecil用于.NET的原因相同manipulations@BartoszWójcik如何将Reflector嵌入到应用程序中以生成扩展的调试信息?它的许可证允许吗?