阅读 DynamicMethod 的 LocalSignature:非标准类型令牌

本文关键字:非标准 类型 令牌 LocalSignature DynamicMethod 阅读 | 更新日期: 2023-09-27 18:34:14

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

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

但是,对于 DynamicMethods,方法主体无法通过 GetMethodBody(( 获得。我找到了一个解决方法,它将本地签名作为字节数组,然后根据 CIL 规范从那里提取方法局部变量的计数、类型和索引。只要我们处理本机类型(短,字节,字符串...

但是,如果局部变量是类类型,则会使用 ELEMENT_TYPE_INTERNAL (0x21( 标志引用它,而不是在局部签名中ELEMENT_TYPE_CLASS。

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

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

阅读 DynamicMethod 的 LocalSignature:非标准类型令牌

好吧,我相信我明白了!

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

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