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

形式 アセンブリ形式 説明
28 <T> methodDesc を呼び出します methodDesc記述されているメソッドを呼び出します。

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

  1. を介したarg1argNメソッド引数は、スタックにプッシュされます。

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

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

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

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

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

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

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

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

Note

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

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

Note

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

適用対象