.net - 通过反射查找 FieldRef 和 FieldDef 元数据标记

标签 .net reflection metadata field cil

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

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

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

有什么方法可以通过反射查找这样的元数据标记吗?

最佳答案

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

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

关于.net - 通过反射查找 FieldRef 和 FieldDef 元数据标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18263472/

相关文章:

java - Java中的不安全反射是什么?

java - 从结果集中的元数据获取表名称时遇到问题

java - 在 PDF 中插入/更新 XMP?

.net - 使用.Net ServiceInstaller在服务安装上设置 'Start Parameters'吗?

c# - 尝试使用 LINQ 表达式创建 "Fluent"类型类

C#——我们应该检查 lambda 中的传入参数吗?

.net - 如何在 Rider 中触发文件更改的设计时构建?

C# 动态类型初始化器

c# - 如何使用反射获取命名空间、类、方法及其参数

algorithm - 是堆栈溢出上的10,000,000吗?