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

时间:2012-05-16 08:14:06

标签: c# cil reflection.emit

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

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

但是,使用DynamicMethods,GetMethodBody()无法使用方法体。我发现了一个解决方法,它将本地签名作为字节数组,从那里我可以根据CIL规范提取方法的本地的计数,类型和索引。只要我们处理本机类型(短,字节,字符串......),一切都很好。

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

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

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

1 个答案:

答案 0 :(得分:1)

嗯,我相信我明白了!

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

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