OpCodes.Call フィールド

定義

渡されたメソッド記述子によって示されるメソッドを呼び出します。

public: static initonly System::Reflection::Emit::OpCode Call;
public static readonly System.Reflection.Emit.OpCode Call;
 staticval mutable Call : System.Reflection.Emit.OpCode
Public Shared ReadOnly Call As OpCode 

フィールド値

注釈

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

フォーマット アセンブリ形式 Description
28 <T> 呼び出し methodDesc methodDescで記述されているメソッドを呼び出します。

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

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

  2. arg1を介してargNメソッド引数はスタックからポップされます。メソッド呼び出しは、これらの引数を使用して実行され、制御はメソッド記述子によって参照されるメソッドに転送されます。 完了すると、戻り値が呼び出し先メソッドによって生成され、呼び出し元に送信されます。

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

call命令は、命令で渡されたメソッド記述子によって示されるメソッドを呼び出します。 メソッド記述子は、呼び出すメソッドと、そのメソッドに渡されるスタックに配置された引数の数、型、順序、および使用する呼び出し規則を示すメタデータ トークンです。 call命令の直前にtail (Tailcall) プレフィックス命令を付けて、制御を転送する前に現在のメソッドの状態を解放するように指定できます。 呼び出しは、元のメソッドよりも高い信頼のメソッドに制御を転送する場合、スタック フレームは解放されません。 代わりに、 tail が指定されていないかのように、実行はサイレントで続行されます。 メタデータ トークンは、呼び出しが静的メソッド、インスタンス メソッド、仮想メソッド、またはグローバル関数のいずれに対する呼び出しであるかを判断するのに十分な情報を持っています。 いずれの場合も、宛先アドレスはメソッド記述子から完全に決定されます (これは、仮想メソッドを呼び出すための Callvirt 命令とは対照的です。宛先アドレスは、 Callvirtの前にプッシュされたインスタンス参照のランタイム型にも依存します)。

引数は、左から右の順序でスタックに配置されます。 つまり、最初の引数が計算されてスタックに配置され、次に 2 番目の引数、次に 3 番目の引数が、必要なすべての引数が降順でスタックの上に配置されます。 3 つの重要な特殊なケースがあります。

  1. インスタンス (または仮想) メソッドの呼び出しでは、ユーザーが参照できる引数の前にそのインスタンス参照をプッシュする必要があります。 インスタンス参照を null 参照にすることはできません。 メタデータに含まれるシグネチャには、 this ポインターのパラメーター リストにエントリが含まれていません。代わりに、メソッドが this ポインターを渡す必要があるかどうかを示すためにビットを使用します。

  2. (callではなく) callvirtを使用して仮想メソッドを呼び出すことができます。これは、呼び出されるオブジェクトから動的に指定されたクラスではなく、メソッドで指定されたクラスを使用してメソッドを解決することを示します。

  3. デリゲートの Invoke メソッドは、 call または callvirt 命令を使用して呼び出すことができます。

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

Note

値型で System.Object のメソッドを呼び出す場合は、constrained命令を出力する代わりに、callvirt命令で call プレフィックスを使用することを検討してください。 これにより、値型がメソッドをオーバーライドするかどうかに応じて異なる IL を出力する必要がなくなります。これにより、バージョン管理の問題を回避できます。 インターフェイス メソッドを実装する値型メソッドはconstrainedを使用して変更できるため、値型に対してインターフェイス メソッドを呼び出すときは、MethodImpl プレフィックスを使用することを検討してください。 これらの問題については、 Constrained オペコードで詳しく説明します。

次の Emit メソッドオーバーロードでは、 call オペコードを使用できます。

Note

EmitCall呼び出しには、varargs メソッドが用意されています。 通常の呼び出しには、 Emit メソッドを使用します。

適用対象