我最近开始使用 VS2010 中的 ILVisualizer 来检查 IL 的动态方法。但是它不会从 IL 流中提取 LocalVariable 信息,所以我正在试一试(当然是为了好玩,而且因为这是一个很好的学习体验:)
对于静态编译的方法,这不是问题,因为我们可以通过 GetMethodBody() 访问方法的主体并从那里获取局部变量。
然而,对于 DynamicMethods,方法体不能通过 GetMethodBody() 获得。我找到了一个变通方法,它将本地签名作为字节数组获取,并且根据 CIL 规范,我可以从那里提取方法本地的计数、类型和索引。只要我们处理的是原生类型(短整型、字节、字符串...),一切都很好。
但如果局部变量是类类型,则它会使用 ELEMENT_TYPE_INTERNAL (0x21) 标志而不是局部签名中的 ELEMENT_TYPE_CLASS 进行引用。
不幸的是,我找不到任何关于如何读取存储为 ELEMENT_TYPE_INTERNAL 的类型的信息。 那是怎么回事 ? MS 是否将非标准 CIL 用于动态方法?有人知道正确阅读这些签名的方法吗?
编辑 我偶然发现了一些 mscorlib.dll 的源文件,并从 SignatureHelper 的源代码中发现,当该类是运行时类型时,可能会发生这种情况。我会调查一下...
最佳答案
好吧,我相信我明白了!
事实证明,ELEMENT_TYPE_INTERNAL 标志之后的数据不是压缩数据,它是一个普通的 32 位整数(或 64 位,取决于平台,尽管我必须确认)存储在 4 个字节上,这是指针到引用的类型。
即使我找不到从 IntPtr 获取 RuntimeTypeHandle 的方法,循环遍历方法的 DynamicScope 对象中的标记并比较值也可以获取类型句柄。
关于c# - 读取动态方法的本地签名 : non standard type tokens?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10614484/