我尝试运行出现在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中列出变量名(myStringmyInt)?

环境信息:
  • Windows 7 64位
  • Visual Studio 2010专业版SP1
  • .Net 4.0.30319 SP1
  • 目标框架:.Net 4客户端配置文件
  • 调试配置(用于使用System.Reflection.Emit的程序)

  • 编辑:正如我在评论中指出的,有一个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/

    10-13 00:24