4

我为了好玩而制作了一个愚蠢的 AOT .net 编译器,但遇到了问题。

我只是将程序集加载到内存中(我正在用 C# 编写它)并左右发送垃圾邮件以获取我需要的信息(例如方法体的 CIL)。

此页面显示“我们需要对当前实例的引用(存储在本地参数索引 0 中)[...]”。但是,当我调用 时MethodInfo.GetParameters(),不会返回此参数。

我正在解析操作码中的字段,例如LdargParameterInfo 对象,而不是原始索引,因此当“Ldarg.0”在实例方法中时它会变得非常混乱 - 因为 arg 0 不在GetParameters

我的主要问题:有什么方法可以获取ParameterInfo对象的this对象实例(参数索引 0),还是只需要使用原始索引?(我真的不想使用 int 索引......)

这是一些代码,因为代码很好。(包含在类程序中)

static void Main(string[] args)
{
    // obviously throws an IndexOutOfRangeException instead of returning the (true) argument 0
    Console.WriteLine(typeof (Program).GetMethod("Test").GetParameters()[0]);
}

public void Test()
{
}
4

1 回答 1

2

您没有为此获得 ParameterInfo。简单地说:如果它是一个实例方法,则有一个“this”映射到方法声明类型的 arg-0。除了它的类型,它没有名字,也没有有趣的属性。所有其他参数偏移一。对于静态方法,情况并非如此。请注意,对于作为 by-ref 参数的值类型的实例方法,这会变得更加有趣。

于 2013-05-11T16:31:35.790 回答