通过Reflection查找FieldRef和FieldDef元数据标记

时间:2013-08-15 23:18:22

标签: .net reflection metadata field cil

我正在开发一个从.NET程序集预编译字节码的程序。这个程序本身就是一个.NET程序 - 到目前为止,我已经能够使用反射来提取所有需要的信息,包括字节码本身。但是,我在实现ldfld的翻译时遇到了问题。

ldfld和类似的指令在其编码中有一个元数据标记,它引用了 FieldRef FieldDef 。我理解这些是嵌入在程序集的PE文件中的元数据表中的元素。在最坏的情况下,我确实从ECMA-335获得了足够的信息来打开PE文件并自己查看所有这些,但这是很多工作,并且与我通过Reflection获得的其他信息不一致,所以我更喜欢通过Reflection进行查找。

但是,我似乎找不到查找元数据令牌的System.Reflection.Assembly上的任何方法。 (我可能只是错过了它。)我不能在比程序集更具体的任何内容上进行查找,因为我只知道引用程序集,直到我看到元数据(catch-22。)实际上,正如评论中所述,在检查元数据之前,我甚至不知道定义字段的汇编程序。

有没有办法通过Reflection查找这些元数据标记?

1 个答案:

答案 0 :(得分:2)

您在Assembly上找不到任何内容,因为FieldDef和FieldRef不属于程序集,它们属于模块(大多数程序集只有一个模块,但是他们可以有更多)。 Module具有您想要的方法:ResolveField()。你可以使用这样的东西:

Module module = …;
int fieldToken = …;
FieldInfo field = module.ResolveField(fieldToken);