在非.NET Framework版本中,能否用Reflection.Emit类为动态程序集添加调试信息?
动态生成程序集时添加调试信息的可行性(.NET Core 5/6/7)
可以在.NET Core 5、6、7中使用System.Reflection.Emit的AssemblyBuilder、TypeBuilder、MethodBuilder为动态生成的程序集添加局部变量名、源代码信息等调试信息,具体实现方式如下:
- 启用调试符号生成:创建
AssemblyBuilder时,需指定包含调试符号的生成选项。例如使用AssemblyBuilder.DefineDynamicAssembly时,传入AssemblyBuilderOptions.DebugAndReleaseSymbols,确保模块会生成调试符号数据。若需要持久化符号,创建ModuleBuilder时可指定pdb文件的生成路径。 - 设置局部变量名:通过
MethodBuilder.DefineLocal创建LocalBuilder后,调用LocalBuilder.SetLocalSymInfo(string name)方法为局部变量设置名称,调试器就能在调试过程中识别并显示这些变量名,而非默认的V_0、V_1之类的占位符。 - 关联源代码位置:先通过
ModuleBuilder.DefineDocument创建ISymbolDocumentWriter(可指定虚拟的源代码文件名,比如"DynamicCode.cs"),然后在ILGenerator中调用MarkSequencePoint方法,将特定IL指令与源代码的行号、列号关联。调试时,调试器会跳转到你指定的“虚拟源代码”位置,方便跟踪动态生成代码的执行流程。
现代调试器(如Visual Studio、Rider)都支持读取动态生成的程序集符号,调试体验和静态编译的代码基本一致。
内容的提问来源于stack exchange,提问作者Pero P
相关产品推荐
相关产品推荐

