OpCodes.Calli OpCodes.Calli OpCodes.Calli OpCodes.Calli Field


呼び出し規約によって記述されている引数を使用して、評価スタックで (エントリ ポイントへのポインターとして) 指定されているメソッドを呼び出します。Calls the method indicated on the evaluation stack (as a pointer to an entry point) with arguments described by a calling convention.

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 



次の表は、命令の 16 進数と簡単なリファレンス概要と共に、Microsoft Intermediate Language (MSIL) アセンブリの形式を示します。The following table lists the instruction's hexadecimal and Microsoft Intermediate Language (MSIL) assembly format, along with a brief reference summary:

形式Format アセンブリの形式Assembly Format 説明Description
29 < T >29 < T > callicalli callSiteDescr 呼び出し規則によって記述されている引数を指すメソッドを呼び出します。Calls the method pointed to with arguments described by the calling convention.

履歴の移行動作を順番には。The stack transitional behavior, in sequential order, is:

  1. メソッドの引数arg1を通じてargNスタックにプッシュされます。Method arguments arg1 through argN are pushed onto the stack.

  2. メソッドのエントリのポインターがスタックにプッシュされます。The method entry pointer is pushed onto the stack.

  3. メソッドの引数arg1を通じてargNとメソッドのエントリのポインターがスタックからポップ; メソッドの呼び出しを実行します。Method arguments arg1 through argN and the method entry pointer are popped from the stack; the call to the method is performed. 完了すると、戻り値が呼び出し先メソッドによって生成され、呼び出し元に送信します。When complete, a return value is generated by the callee method and sent to the caller.

  4. 戻り値は、スタックにプッシュされます。The return value is pushed onto the stack.

calli命令は、引数を持つメソッドのエントリのポインターを呼び出すarg1を通じてargNします。The calli instruction calls the method entry pointer with the arguments arg1 through argN. これらの引数の型は、特定の呼び出し規則によって記述されます (callSiteDesc)。The types of these arguments are described by the specific calling convention (callSiteDesc). calli命令ではすぐに付くことがあります、tailプレフィックス (Tailcall) メソッドの現在の状態が制御を転送する前にリリースされることを指定します。The calli instruction may be immediately preceded by a tail prefix (Tailcall) to specify that the current method state should be released before transferring control. 呼び出しが転送される場合、元のメソッドのスタック フレームより信頼性の高いメソッドに制御は解放されません。代わりに、実行が継続される場合と、tailが提供されています。If the call would transfer control to a method of higher trust than the origin method the stack frame will not be released; instead, the execution will continue silently as if the tail had not been supplied.

メソッドのエントリのポインターは、呼び出し規則 (スタンドアロン シグネチャのメタデータ トークン) で説明されている引数で正規に呼び出すことができる (ターゲット コンピューター) のネイティブ コードへの特定のポインターと見なされます。The method entry pointer is assumed to be a specific pointer to native code (of the target machine) that can be legitimately called with the arguments described by the calling convention (a metadata token for a stand-alone signature). 使用してこのようなポインターを作成することができます、LdftnまたはLdvirtftn手順については、ネイティブ コードから渡されたか。Such a pointer can be created using the Ldftn or Ldvirtftn instructions, or passed in from native code.

呼び出し規約が動的にチェックされませんが、これを使用するコードをcalli変換先が実際には指定した呼び出し規約を使用しない場合、命令が正常に動作しません。The calling convention is not checked dynamically, so code that uses a calli instruction does not work correctly if the destination does not actually use the specified calling convention.

引数は、左から右の順序でスタックに配置されます。The arguments are placed on the stack in left-to-right order. つまり、最初の引数が計算され、まで、降順でスタックの一番上のすべての必要な引数がスタックし、2 番目の引数は 3 番目の配置。That is, the first argument is computed and placed on the stack, then the second argument, then the third, until all necessary arguments are atop the stack in descending order. インスタンスまたは仮想メソッドの引数構築コード シーケンスでは、任意のユーザーに表示される引数の前に、そのインスタンスの参照 (これは、null 参照をできないようにする必要があります) をプッシュする必要があります。The argument-building code sequence for an instance or virtual method must push that instance reference (which must not be a null reference) before any of the user-visible arguments.

SecurityException システムのセキュリティは、呼び出されたメソッドを呼び出し元アクセスを許可していない場合にスローされる可能性が。may be thrown if the system security does not grant the caller access to the called method. セキュリティ チェックは、実行時ではなくネイティブ コードに、Microsoft Intermediate Language (MSIL) 命令が変換される場合に発生することができます。The security check can occur when the Microsoft Intermediate Language (MSIL) instructions are converted to native code rather than at runtime.

EmitCalliメソッドを実行するために使用できる、calliスタック上の命令。The following EmitCalli methods can be used to perform a calli instruction on the stack. なおcalliを介して呼び出す必要があります、以下を使用するのではなく、メソッド、Emitクラス、スタック上で直接、命令を配置します。Note that calli should be called through the below methods rather than using the Emit class to place the instruction directly on the stack.

  • ILGenerator.EmitCalli (オペコード、CallingConventions、種類は、マネージ呼び出し規則を使用して呼び出し用 Type[]) を入力します。ILGenerator.EmitCalli(Opcode, CallingConventions, Type, Type[], Type[]) for calls using a managed calling convention.

  • ILGenerator.EmitCalli (オペコード、アンマネージ呼び出し規則を使用して、呼び出しの CallingConvention、型、Type[]) です。ILGenerator.EmitCalli(Opcode, CallingConvention, Type, Type[]) for calls using an unmanaged calling convention.