我正在尝试查看如何使用 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)
) 我收到“公共(public)语言运行时检测到无效程序”异常。该问题的原因可能是什么?
附言: 这里是 a gist使用我用于测试的 CIL。评论跳转到 Id2
的行并取消注释跳转到 Id
的那个在 IdInt
使它在运行时因上述异常而失败。制作IdInt
和 Id2
返回类似 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 token 都能够引用非泛型方法和开放泛型方法,但要引用封闭的泛型方法需要一个 MethodSpec token ,该 token 未被列为可接受的。
我怀疑 jmp 可能不支持泛型方法,因为它会干扰 jits 为同一泛型方法的不同实例重用 native 代码的能力。
关于.Net CIL jmp 操作码和泛型方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40060302/