我试图了解如何使用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
的行会使其在运行时因上述异常而失败。让IdInt
和Id2
返回类似StringBuilder
的引用类型并不会使它失败。
答案 0 :(得分:3)
ECMA-335分区III第3.37节 - jmp说:
将控制转移到方法指定的方法,这是一个元数据标记(methodref或 methoddef(参见Partition II)。当前参数将传输到目标方法。
MemberRef和MethodDef标记都能够引用非泛型方法并打开泛型方法,但要引用封闭的泛型方法,需要一个未列为可接受的MethodSpec标记。
我怀疑jmp可能不支持泛型方法,因为它会干扰jits为同一泛型方法的不同实例重用本机代码的能力。