我们正在使用System.Reflection.Emit在源代码中从源代码生成代码(是的 - 在编译器中).我们使用MarkSequencePoint等向ILGenerator提供正确的符号信息,并启用AssemblyBuilder上的所有调试标志.程序集在编译它的同一进程中保存在内存中,并直接执行.
当使用Visual Studio调试器逐步完成动态生成的代码的源代码时,它实际上工作得很好,并且Visual Studio似乎完全了解代码来自文件和行号的位置.
无论其-当异常被抛出生成的代码,该System.Exception的对象包含堆栈是完全错误的痕迹.它们指向其他(有效但错误的)文件和行号.它获取了类和方法名称,但指向的文件和行号与实例异常的代码路径无关.
指向的文件是如此无关,似乎无法链接到内联或优化.我能看到的唯一模式是它似乎被一些文件所抵消(在一个假想的按字母顺序排序的源文件列表中,汇编是从中构建的).但是,这种模式并非100%一致,而且这与问题的根源相关联似乎是不合理的.
如果我从Exception构造一个System.Diagnostics.Debug对象,它包含相同的错误信息.
我假设.NET运行时使用相同的元数据来构造Exception堆栈跟踪,因为调试器用于单步执行代码,在这种情况下,这种行为非常奇怪.
我试图在处理动态内存中的程序集时,或者如果有人在其他方面遇到过类似的问题,那么这是否是.NET中的一个已知错误.
我正在使用AssemblyBuilder创建一个复杂的类,我稍后会从中创建对象.然而,这个班级真正构建的方式存在不确定性.那么有没有办法将这个动态创建的类写入cs文件进行检查?
我可以将dll文件写入磁盘,但我需要cs文件.