OpCodes.Calli 字段
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
通过调用约定描述的参数调用在计算堆栈上指示的方法(作为指向入口点的指针)。
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 |
使用由调用约定描述的参数调用指向 的方法。 |
堆栈过渡行为(按顺序排列)为:
通过
argN
的方法参数arg1
将推送到堆栈上。方法输入指针将推送到堆栈上。
通过 的方法参数
arg1
argN
和方法输入指针从堆栈中弹出;执行对 方法的调用。 完成后,被调用方方法会生成一个返回值,并将其发送给调用方。返回值将推送到堆栈上。
指令calli
通过 argN
调用带有参数arg1
的方法入口指针。 这些参数的类型由特定调用约定 (callSiteDesc
) 描述。 指令 calli
前面可能紧接前缀 tail
(Tailcall) 指定在转移控制权之前应释放当前方法状态。 如果调用会将控制权转移到信任度高于源方法的方法,则不会释放堆栈帧;相反,执行将以静默方式继续, tail
就像未提供 一样。
假定方法入口指针是指向目标计算机) 本机代码 (的特定指针,可以使用调用约定描述的参数合法调用, (独立签名) 的元数据标记。 可以使用 或 Ldvirtftn 指令创建Ldftn此类指针,也可以从本机代码传入。
调用约定不会动态检查,因此,如果目标实际未使用指定的调用约定,则使用 calli
指令的代码将无法正常工作。
参数按从左到右的顺序放置在堆栈上。 也就是说,计算第一个参数并将其放置在堆栈上,然后第二个参数,然后第三个参数,直到所有必需的参数都按降序排列在堆栈上。 实例或虚拟方法的参数生成代码序列必须推送该实例引用 (该引用不得在任何用户可见参数之前) null 引用。
SecurityException 如果系统安全未向调用方授予调用方对被调用方法的访问权限,则可能会引发 。 当 Microsoft 中间语言 (MSIL) 指令转换为本机代码而不是运行时时,可能会发生安全检查。
以下 EmitCalli 方法可用于在堆栈上执行 calli
指令。 请注意, calli
应通过以下方法调用,而不是使用 Emit 类将指令直接放在堆栈上。
ILGenerator.EmitCalli(OpCode, CallingConventions, Type, Type[], Type[]) 对于使用托管调用约定的调用。
ILGenerator.EmitCalli(OpCode, CallingConvention, Type, Type[]) 对于使用非托管调用约定的调用。