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)程序集格式,以及简短的参考摘要:

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

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

  1. 方法arg1参数argN被推送到堆栈上。

  2. 方法入口指针被推送到堆栈上。

  3. 方法自变量arg1argN和方法条目指针从堆栈中弹出;将执行对方法的调用。 完成后,返回值由被调用方方法生成,并发送到调用方。

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

指令calli通过参数arg1argN调用方法条目指针。 这些参数的类型由特定的调用约定(callSiteDesc) 描述。 指令 calli 可能紧接前缀 tailTailcall)以指定在传输控件之前应释放当前方法状态。 如果调用将控制权转移到比源方法更高的信任方法,则不会释放堆栈帧;相反,执行将继续以无提示方式继续,就好像 tail 尚未提供执行一样。

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

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

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

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

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

适用于