.Net CIL jmp操作码和通用方法

时间:2016-10-15 14:33:17

标签: .net cil

我试图了解如何使用jmp操作码,到目前为止我还没有设法调用泛型方法。对于我的测试,我有一个方法只返回它的参数,而另一个方法的主体只是jmp操作码跳转到第一个方法。我的问题是,当我跳转到非泛型方法时(例如jmp int32 Program::Id2(int32)具有Id2的以下签名:static int Id2(int x)),在运行时没有错误,而如果我这样做的话通用方法(例如jmp !!0 Program::Id<int32>(!!0)具有Id的以下签名:static T Id<T>(T x))我得到“公共语言运行时检测到无效程序”异常。可能是造成这个问题的原因是什么?

P.S。 :这是我用于测试的CIL的a gist。注释跳转到Id2的行并取消注释Id中跳转到IdInt的行会使其在运行时因上述异常而失败。让IdIntId2返回类似StringBuilder的引用类型并不会使它失败。

1 个答案:

答案 0 :(得分:3)

ECMA-335分区III第3.37节 - jmp说:

  

将控制转移到方法指定的方法,这是一个元数据标记(methodref或   methoddef(参见Partition II)。当前参数将传输到目标方法。

MemberRef和MethodDef标记都能够引用非泛型方法并打开泛型方法,但要引用封闭的泛型方法,需要一个未列为可接受的MethodSpec标记。

我怀疑jmp可能不支持泛型方法,因为它会干扰jits为同一泛型方法的不同实例重用本机代码的能力。