.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分),但不能将此标记为正确答案(确实如此)因为我没有问最初的问题!好了,赏金已经颁发,很抱歉耽搁了:)