为什么LocalBuilder.SetLocalSymInfo没有发出变量名?

Wes*_*ser 6 il reflection.emit .net-4.0 variable-names debug-symbols

我试图运行出现的文档页面上的示例代码System.Reflection.Emit.LocalBuilder类,但它看来,调用LocalBuilder.SetLocalSymInfo(string, int, int)没有做任何事情,因为IL反汇编显示了这个作为IL的SampleAssembly.dll:

.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
Run Code Online (Sandbox Code Playgroud)

为什么不在Dissasembler中列出变量名(myStringmyInt)?

环境信息:

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

编辑:正如我在评论中提到的,有一个SampleAssembly.pdb文件与SampleAssembly.dll文件一起生成.

Jer*_*ers 5

System.Reflection.Emit中的调试支持非常差并且很古怪(在某种程度上,对于IKVM.Reflection也是如此,因为它继承了自从之后必须使用的底层.pdb编写器API的一些破坏性. .pdb文件格式未记录).

无论如何,样本不起作用的原因是它缺少以下代码:

ISymbolDocumentWriter doc = myModule.DefineDocument("sourcefile", Guid.Empty, Guid.Empty, Guid.Empty);

myMethodIL.MarkSequencePoint(doc, 1, 0, 1, 0);
Run Code Online (Sandbox Code Playgroud)

方法中必须至少有一个序列点,因为这是内部数据结构连接在一起的方式.