OpCodes.Calli 字段

定义

通过调用约定描述的参数调用在计算堆栈上指示的方法(作为指向入口点的指针)。

C#
public static readonly System.Reflection.Emit.OpCode Calli;

字段值

注解

下表列出了指令的十六进制和 Microsoft 中间语言 (MSIL) 程序集格式,以及简短的参考摘要:

格式 程序集格式 说明
29 <T> 愈 伤 组织 callSiteDescr 使用由调用约定描述的参数调用指向 的方法。

堆栈过渡行为(按顺序排列)为:

  1. 通过 argN 的方法参数arg1将推送到堆栈上。

  2. 方法输入指针将推送到堆栈上。

  3. 通过 的方法参数arg1argN和方法输入指针从堆栈中弹出;执行对 方法的调用。 完成后,被调用方方法会生成一个返回值,并将其发送给调用方。

  4. 返回值将推送到堆栈上。

指令calli通过 argN调用带有参数arg1的方法入口指针。 这些参数的类型由特定调用约定 (callSiteDesc) 描述。 指令 calli 前面可能紧接前缀 tail (Tailcall) 指定在转移控制权之前应释放当前方法状态。 如果调用会将控制权转移到信任度高于源方法的方法,则不会释放堆栈帧;相反,执行将以静默方式继续, tail 就像未提供 一样。

假定方法入口指针是指向目标计算机) 本机代码 (的特定指针,可以使用调用约定描述的参数合法调用, (独立签名) 的元数据标记。 可以使用 或 Ldvirtftn 指令创建Ldftn此类指针,也可以从本机代码传入。

调用约定不会动态检查,因此,如果目标实际未使用指定的调用约定,则使用 calli 指令的代码将无法正常工作。

参数按从左到右的顺序放置在堆栈上。 也就是说,计算第一个参数并将其放置在堆栈上,然后第二个参数,然后第三个参数,直到所有必需的参数都按降序排列在堆栈上。 实例或虚拟方法的参数生成代码序列必须推送该实例引用 (该引用不得在任何用户可见参数之前) null 引用。

SecurityException 如果系统安全未向调用方授予调用方对被调用方法的访问权限,则可能会引发 。 当 Microsoft 中间语言 (MSIL) 指令转换为本机代码而不是运行时时,可能会发生安全检查。

以下 EmitCalli 方法可用于在堆栈上执行 calli 指令。 请注意, calli 应通过以下方法调用,而不是使用 Emit 类将指令直接放在堆栈上。

适用于

产品 版本
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9, 10
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.6, 2.0, 2.1
UWP 10.0