3

我最近开始在 VS2010 中使用 ILVisualizer 来检查 IL 中的动态方法。但是它不会从 IL 流中提取 LocalVariable 信息,所以我尝试一下(当然是为了它的乐趣,并且因为它是一个很好的学习体验 :)

对于静态编译的方法,这不是问题,因为我们可以通过 GetMethodBody() 访问方法的主体并从那里获取局部变量。

然而,对于 DynamicMethods,方法体不能通过 GetMethodBody() 获得。我找到了一种解决方法,它将本地签名作为字节数组获取,然后根据 CIL 规范,我可以从那里提取方法的本地变量的计数、类型和索引。只要我们处理本地类型(短、字节、字符串...),一切都很好。

但是,如果局部变量是类类型,则使用 E​​LEMENT_TYPE_INTERNAL (0x21) 标志而不是本地签名中的 ELEMENT_TYPE_CLASS 来引用它。

不幸的是,我找不到任何关于如何读取存储为 ELEMENT_TYPE_INTERNAL 的类型的信息。那是怎么回事 ?MS 是否将非标准 CIL 用于动态方法?有人知道正确阅读这些签名的方法吗?

编辑我偶然发现了一些 mscorlib.dll 的源文件,并从 SignatureHelper 的源代码中发现,当类是运行时类型时,这可能会发生。我会调查那个...

4

1 回答 1

1

好吧,我相信我明白了!

事实证明,ELEMENT_TYPE_INTERNAL 标志之后的数据不是压缩数据,它是一个普通的 32 位整数(或 64,取决于平台,尽管我必须确认)存储在 4 个字节上,它是指向引用的指针类型。

即使我找不到从 IntPtr 获取 RuntimeTypeHandle 的方法,循环遍历该方法的 DynamicScope 对象中的标记并比较值也可以获取类型句柄。

于 2012-05-16T14:38:49.167 回答