我尝试运行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
为什么变量名称(myString
和myInt
)不在Dissasembler中列出?
环境信息:
编辑:正如我在评论中提到的,有一个SampleAssembly.pdb文件与SampleAssembly.dll文件一起生成。
答案 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文件的调试器中的代码来验证这一点。