OpCodes.Callvirt フィールド

定義

オブジェクトで遅延バインディング メソッドを呼び出し、戻り値を評価スタックにプッシュします。

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

フィールド値

注釈

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

フォーマット アセンブリ形式 Description
6f <T> Callvirt method objに関連付けられている特定のメソッドを呼び出します。

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

  1. オブジェクト参照 obj がスタックにプッシュされます。

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

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

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

callvirt命令は、オブジェクトの遅延バインディング メソッドを呼び出します。 つまり、メソッドは、メソッド ポインターに表示されるコンパイル時クラスではなく、 obj のランタイム型に基づいて選択されます。 Callvirt は、仮想メソッドとインスタンス メソッドの両方を呼び出すために使用できます。 callvirt命令の直前にtail (Tailcall) プレフィックスを付けて、制御を転送する前に現在のスタック フレームを解放する必要があることを指定できます。 呼び出しが元のメソッドよりも高い信頼のメソッドに制御を転送する場合、スタック フレームは解放されません。

メソッド メタデータ トークンは、呼び出すメソッドの名前、クラス、およびシグネチャを提供します。 objに関連付けられているクラスは、インスタンスであるクラスです。 指定されたメソッド名とシグネチャに一致する非静的メソッドがクラスで定義されている場合、このメソッドが呼び出されます。 それ以外の場合、このクラスの基底クラス チェーン内のすべてのクラスが順番にチェックされます。 メソッドが見つからない場合はエラーです。

Callvirt は、メソッドを呼び出す前に、オブジェクトと関連する引数を評価スタックからポップします。 メソッドに戻り値がある場合は、メソッドの完了時にスタックにプッシュされます。 呼び出し先側では、 obj パラメーターは引数 0、 arg1 引数 1 などとしてアクセスされます。

引数は、左から右の順序でスタックに配置されます。 つまり、最初の引数が計算されてスタックに配置され、次に 2 番目の引数、次に 3 番目の引数が、必要なすべての引数が降順でスタックの上に配置されます。 インスタンス参照 obj (常に callvirtに必要) は、ユーザーが参照できる引数の前にプッシュする必要があります。 署名 (メタデータ トークンに含まれる) には、このポインターのパラメーター リストにエントリを含める必要はありません。

仮想メソッドは、 Call 命令を使用して呼び出すこともできます。

MissingMethodException は、指定された名前とシグネチャを持つ非静的メソッドが、 obj またはその基底クラスに関連付けられているクラスで見つからなかった場合にスローされます。 これは通常、Microsoft Intermediate Language (MSIL) 命令が実行時ではなくネイティブ コードに変換されるときに検出されます。

NullReferenceException は、obj が null の場合にスローされます。

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

Note

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

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

適用対象