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

标签 .net cil

我正在尝试查看如何使用 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/

相关文章:

C# web 控件是否会在 visible 为 false 时显示

c# - DynamicMethod 比已编译的 IL 函数慢得多

c# - 为什么 enum.ToString box/callvirt,而不是推送地址和调用?还有其他特殊情况吗?

c# - 如何检测我正在加载的 .NET 程序集是否包含不安全代码?

c# - CIL中有SIMD指令吗?

.net - 在遇到问题的 Docker 上部署 Blazor Client(WebAssembly)

c# - 如何从.Net代码获取IP地址

.net - 哪种泛型参数约束组合将使 C# 编译器为 GenericParamConstraint 元数据表生成行?

c# - 基类的处理顺序

.net - 分析进程中加载​​的 native DLL 和程序集的内存占用的工具?