我尝试运行出现在System.Reflection.Emit.LocalBuilder类的文档页面上的示例代码,但是由于IL Dissasembler将其显示为SampleAssembly.dll的IL,因此对LocalBuilder.SetLocalSymInfo(string, int, int)
的调用似乎没有任何作用:
.method public static string Function1(int32 A_0) cil managed
{
// Code size 10 (0xa)
.maxstack 1
.locals init (string V_0,
int32 V_1)
IL_0000: ldarg.0
IL_0001: stloc.1
IL_0002: ldstr "string value"
IL_0007: stloc.0
IL_0008: ldloc.0
IL_0009: ret
} // end of method Example::Function1
为什么未在Dissasembler中列出变量名(
myString
和myInt
)?环境信息:
编辑:正如我在评论中指出的,有一个SampleAssembly.pdb文件与SampleAssembly.dll文件一起生成。
最佳答案
System.Reflection.Emit中的调试支持非常差且很古怪(在某种程度上,IKVM.Reflection也是如此,因为它继承了自.pdb编写器以来必须使用的基础.pdb writer API的某些缺陷。 .pdb文件格式未记录)。
无论如何,该示例不起作用的原因是它缺少以下代码:
ISymbolDocumentWriter doc = myModule.DefineDocument("sourcefile", Guid.Empty, Guid.Empty, Guid.Empty);
myMethodIL.MarkSequencePoint(doc, 1, 0, 1, 0);
该方法中至少必须有一个序列点,因为这是将内部数据结构绑定(bind)在一起的方式。
关于.net-4.0 - 为什么LocalBuilder.SetLocalSymInfo不发出变量名?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9253498/