我最近开始在 VS2010 中使用 ILVisualizer 来检查 IL 中的动态方法。但是它不会从 IL 流中提取 LocalVariable 信息,所以我尝试一下(当然是为了它的乐趣,并且因为它是一个很好的学习体验 :)
对于静态编译的方法,这不是问题,因为我们可以通过 GetMethodBody() 访问方法的主体并从那里获取局部变量。
然而,对于 DynamicMethods,方法体不能通过 GetMethodBody() 获得。我找到了一种解决方法,它将本地签名作为字节数组获取,然后根据 CIL 规范,我可以从那里提取方法的本地变量的计数、类型和索引。只要我们处理本地类型(短、字节、字符串...),一切都很好。
但是,如果局部变量是类类型,则使用 ELEMENT_TYPE_INTERNAL (0x21) 标志而不是本地签名中的 ELEMENT_TYPE_CLASS 来引用它。
不幸的是,我找不到任何关于如何读取存储为 ELEMENT_TYPE_INTERNAL 的类型的信息。那是怎么回事 ?MS 是否将非标准 CIL 用于动态方法?有人知道正确阅读这些签名的方法吗?
编辑我偶然发现了一些 mscorlib.dll 的源文件,并从 SignatureHelper 的源代码中发现,当类是运行时类型时,这可能会发生。我会调查那个...