OpCodes.Calli 字段

定义

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

public: static initonly System::Reflection::Emit::OpCode Calli;
public static readonly System.Reflection.Emit.OpCode Calli;
 staticval mutable Calli : System.Reflection.Emit.OpCode
Public Shared ReadOnly Calli As OpCode 

字段值

注解

下表列出了指令的十六进制和 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 类将指令直接放在堆栈上。

适用于