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 

フィールド値

注釈

次の表に、命令の 16 進数および Microsoft Intermediate Language (MSIL) アセンブリ形式と、簡単なリファレンス概要を示します。

フォーマット アセンブリ形式 Description
29 <T> カルス callSiteDescr 呼び出し規則で説明されている引数を使用して、指すメソッドを呼び出します。

スタック遷移の動作は、順番に次のようになります。

  1. arg1を介してargNメソッド引数がスタックにプッシュされます。

  2. メソッド エントリ ポインターがスタックにプッシュされます。

  3. メソッド引数はarg1を介してargNされ、メソッド エントリ ポインターはスタックからポップされます。メソッドの呼び出しが実行されます。 完了すると、戻り値が呼び出し先メソッドによって生成され、呼び出し元に送信されます。

  4. 戻り値がスタックにプッシュされます。

calli命令は、arg1を介してargN引数を持つメソッド エントリ ポインターを呼び出します。 これらの引数の型は、特定の呼び出し規則 (callSiteDesc) によって記述されます。 calli命令の直前にtail プレフィックス (Tailcall) を付けて、制御を転送する前に現在のメソッドの状態を解放するように指定できます。 呼び出しが元のメソッドよりも高い信頼のメソッドに制御を転送する場合、スタック フレームは解放されません。代わりに、 tail が指定されていないかのように、実行はサイレントで続行されます。

メソッド エントリ ポインターは、呼び出し規約で記述されている引数 (スタンドアロン署名のメタデータ トークン) を使用して正当に呼び出すことができるネイティブ コード (ターゲット コンピューターの) への特定のポインターであると見なされます。 このようなポインターは、 Ldftn または Ldvirtftn 命令を使用して作成するか、ネイティブ コードから渡すことができます。

呼び出し規則は動的にチェックされないため、宛先が指定された呼び出し規則を実際に使用していない場合、 calli 命令を使用するコードは正しく機能しません。

引数は、左から右の順序でスタックに配置されます。 つまり、最初の引数が計算されてスタックに配置され、次に 2 番目の引数、次に 3 番目の引数が、必要なすべての引数が降順でスタックの上に配置されます。 インスタンスまたは仮想メソッドの引数構築コード シーケンスは、ユーザーが参照できる引数の前にそのインスタンス参照 (null 参照ではない) をプッシュする必要があります。

SecurityException は、システム セキュリティが呼び出し元に呼び出し元のメソッドへのアクセスを許可しない場合にスローされる可能性があります。 セキュリティ チェックは、Microsoft Intermediate Language (MSIL) 命令が実行時ではなくネイティブ コードに変換されるときに発生する可能性があります。

次の EmitCalli メソッドを使用して、スタックで calli 命令を実行できます。 calliは、Emit クラスを使用して命令をスタックに直接配置するのではなく、次のメソッドを使用して呼び出す必要があることに注意してください。

適用対象