gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 04:42:28 24 4
gpt4 key购买 nike

我正在尝试查看如何使用 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使它在运行时因上述异常而失败。制作IdIntId2返回类似 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com