.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
的行会使它在运行时失败并出现上述异常。使 IdInt
和 Id2
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 为同一泛型方法的不同实例重用本机代码的能力。
我正在尝试了解如何使用 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
的行会使它在运行时失败并出现上述异常。使 IdInt
和 Id2
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 为同一泛型方法的不同实例重用本机代码的能力。