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) アセンブリ形式と、簡単なリファレンスの概要を示します。

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

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

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

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

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

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

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

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

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

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

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

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

適用対象