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

时间:2012-02-12 22:56:10

标签: .net-4.0 reflection.emit debug-symbols il variable-names

我尝试运行System.Reflection.Emit.LocalBuilder类的文档页面上显示的示例代码,但似乎对LocalBuilder.SetLocalSymInfo(string, int, int)的调用没有做任何事情,因为IL Dissasembler将此显示为IL for 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

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

环境信息:

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

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

3 个答案:

答案 0 :(得分: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);

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

答案 1 :(得分:1)

我怀疑这是因为您正在将模块构建为版本DLL。

尝试将true作为第二个参数传递给AssemblyBuilder.DefineDynamicModule

答案 2 :(得分:1)

符号名称存储在PDB文件中,而不是存储在程序集中。

像Reflector.NET这样的工具会加载PDB文件(如果存在),以便为反汇编的代码提供更好的名称。

您也可以通过调试带有和不带PDB文件的调试器中的代码来验证这一点。