呼び出し規約によって記述されている引数を使用して、評価スタックで (エントリ ポイントへのポインタとして) 指定されているメソッドを呼び出します。
Public Shared ReadOnly Calli As OpCode
[C#]
public static readonly OpCode Calli;
[C++]
public: static OpCode Calli;
[JScript]
public static var Calli : OpCode;
解説
命令の 16 進数の形式、MSIL (Microsoft Intermediate Language) アセンブリ形式、および簡単な説明の一覧を次の表に示します。
形式 | アセンブリ形式 | 説明 |
---|---|---|
29 < T > | calli callSiteDescr | 呼び出し規約によって記述されている引数を使用して、ポインタが指しているメソッドを呼び出します。 |
スタックの遷移動作を順番に示すと、次のようになります。
- メソッド引数の arg1 から argN までがスタックにプッシュされます。
- メソッド エントリ ポインタがスタックにプッシュされます。
- メソッド引数の arg1 から argN まで、およびメソッド エントリ ポインタがスタックからポップされます。メソッドの呼び出しが実行されます。完了すると、呼び出し先メソッドによって戻り値が生成され、呼び出し元へ送られます。
- 戻り値がスタックにプッシュされます。
calli 命令は、引数 arg1 から argN を使用して、メソッド エントリ ポインタを呼び出します。これらの引数の型は、特定の呼び出し規約 (callSiteDesc) に記述されています。 calli 命令の直前に tail プリフィックス (Tailcall) を置くことによって、制御を転送する前に現在のメソッドの状態を解放するように指定できます。呼び出しによって、元のメソッドより信頼性の高いメソッドに制御が転送される場合、スタック フレームは解放されません。その代わりに、tail が提供されなかったかのように、実行が継続されます。
メソッド エントリ ポインタは、呼び出し規約 (スタンドアロン シグネチャのメタデータ トークン) によって記述されている引数を使用して正当に呼び出すことができる、ターゲット コンピュータのネイティブ コードへの固有のポインタであると見なされます。メソッド エントリ ポインタは、 Ldftn 命令または Ldvirtftn 命令を使用して作成する場合も、ネイティブ コードから渡される場合もあります。
呼び出し規約は動的にはチェックされないため、指定した呼び出し規約を呼び出し先が使用していない場合、 calli 命令を使用するコードは正しく動作しません。
引数は、スタック上に左から右に配置されます。つまり、まず最初の引数が計算されてスタックに配置され、次に 2 番目の引数、その次に 3 番目の引数が同様に配置され、最終的に必要なすべての引数が降順でスタックに配置されます。インスタンス メソッドまたは仮想メソッドの引数構築コード シーケンスは、ユーザーが参照できる引数の前に、そのインスタンス参照 (null 参照以外) をプッシュする必要があります。
システム セキュリティが呼び出し元に対して呼び出すメソッドへのアクセスを許可していない場合は、 SecurityException がスローされることがあります。セキュリティ チェックは、実行時ではなく、MSIL (Microsoft Intermediate Language) 命令がネイティブ コードに変換されるときに発生する場合があります。
スタックの calli 命令を実行するために使用できる EmitCalli メソッドを次に示します。命令を直接スタックに配置するには、 Emit クラスを使用せずに、次のメソッドをとおして calli を呼び出す必要があります。
- ILGenerator.EmitCalli(Opcode, CallingConventions, Type, Type[], Type[]) (マネージ呼び出し規約を使用して呼び出す場合)
- ILGenerator.EmitCalli(Opcode, CallingConvention, Type, Type[]) (アンマネージ呼び出し規約を使用して呼び出す場合)
必要条件
プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ