.net 4.0 为什么不是';t LocalBuilder.SetLocalSymInfo发出变量名?

.net 4.0 为什么不是';t LocalBuilder.SetLocalSymInfo发出变量名?,.net-4.0,reflection.emit,debug-symbols,il,variable-names,.net 4.0,Reflection.emit,Debug Symbols,Il,Variable Names,我尝试运行该类的文档页面上显示的示例代码,但似乎对LocalBuilder.SetLocalSymInfo(string,int,int)的调用没有任何作用,因为IL disassembler将其显示为IL for SampleAssembly.dll: .method public static string Function1(int32 A_0) cil managed { // Code size 10 (0xa) .maxstack 1 .locals in

我尝试运行该类的文档页面上显示的示例代码,但似乎对
LocalBuilder.SetLocalSymInfo(string,int,int)
的调用没有任何作用,因为IL disassembler将其显示为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
为什么变量名(
myString
myInt
)没有列在disassembler中

环境信息:

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

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

我怀疑这是因为您正在将模块构建为发布dll


尝试将
true
作为第二个参数传递给
AssemblyBuilder。DefinedDynamicModule

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

Reflector.NET之类的工具将加载PDB文件(如果存在),以便为您反汇编的代码提供更好的名称


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

System.Reflection.Emit中的调试支持非常差且古怪(在某种程度上,IKVM.Reflection也是如此,因为它继承了底层.pdb writer API的一些中断,因为没有记录.pdb文件格式)

无论如何,示例无法工作的原因是缺少以下代码:

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

myMethodIL.MarkSequencePoint(doc, 1, 0, 1, 0);

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

如果查看我链接的示例,作者正在调用
AssemblyBuilder.DefinDynamicModule(string,string,true)
。我还可以看到当前目录中有一个samplessembly.pdb文件。我已经检查了.pdb文件,那里什么都没有!谢谢你,我会在我可以的时候奖励你我的赏金,(在17小时内,+200分),但不能将此标记为正确答案(确实如此)因为我没有问最初的问题!好了,赏金已经颁发,很抱歉耽搁了:)