c# - 读取动态方法的本地签名 : non standard type tokens?

标签 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 的源代码中发现,当该类是运行时类型时,可能会发生这种情况。我会调查一下...

最佳答案

好吧,我相信我明白了!

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

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

关于c# - 读取动态方法的本地签名 : non standard type tokens?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10614484/

相关文章:

c# - 单元测试中的特殊本地字符在任何地方都不相同

c# - 跳过对没有 DynamicMethod 的动态生成方法的可见性检查

c# - 调用基类的事件处理程序的 MSIL 是什么?

.net - 在 C# 中实现编译器最有趣和最有前途的方法是什么?

c# - 如何发出带有预加载 MethodInfo 局部变量的方法?

c# - Property Getter 的反射发射

c# - 在 C# 中调整图像大小

c# - 微软统一 : Interception not working when using BuildUp instead of Resolve

c# - 为什么我的 winforms 应用程序中的自动版本控制没有增加?

c# - 在 C# 中将 CIL 代码更改为 native 代码