6

我尝试运行出现在System.Reflection.Emit.LocalBuilderLocalBuilder.SetLocalSymInfo(string, int, int)类的文档页面上的示例代码,但由于 IL Dissasembler 将其显示为 SampleAssembly.dll 的 IL ,因此调用似乎没有做任何事情:

.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

环境信息:

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

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

4

3 回答 3

5

System.Reflection.Emit 中的调试支持很差而且很古怪(在一定程度上这对 IKVM.Reflection 也是如此,因为它继承了自.pdb 文件格式未记录)。

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

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

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

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

于 2013-02-05T16:03:39.607 回答
2

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

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

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

于 2013-02-05T10:34:56.563 回答
1

我怀疑这是因为您将模块构建为发布 DLL。

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

于 2012-02-13T11:46:39.600 回答