.Net CIL jmp 操作码和泛型方法

.Net CIL jmp opcode and generic methods

我正在尝试了解如何使用 jmp 操作码,但到目前为止我还没有设法调用通用方法。对于我的测试,我有一个方法只是 return 的参数,而另一个方法的主体只是跳转到第一个方法的 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。 : 这是 a gist 我用于测试的 CIL。注释跳转到 Id2 的行并取消注释跳转到 IdInt 中的 Id 的行会使它在运行时失败并出现上述异常。使 IdIntId2 return 成为像 StringBuilder 这样的引用类型并不会使其失败。

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

Transfer control to the method specified by method, which is a metadata token (either a methodref or methoddef (See Partition II). The current arguments are transferred to the destination method.

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

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