OpCodes.Callvirt フィールド
アセンブリ: mscorlib (mscorlib.dll 内)


命令の 16 進数の形式、MSIL (Microsoft Intermediate Language) アセンブリ形式、および簡単な説明の一覧を次の表に示します。
-
メソッド引数の arg1 から argN まで、およびオブジェクト参照 obj が、スタックからポップされます。メソッド呼び出しは、これらの引数を使用して実行され、メソッド メタデータ トークンによって参照される obj 内のメソッドに制御が転送されます。完了すると、呼び出し先メソッドによって戻り値が生成され、呼び出し元へ送られます。
callvirt 命令は、オブジェクト上で遅延バインディング メソッドを呼び出します。つまり、メソッドの選択は、メソッド ポインタで参照できるコンパイル時クラスではなく、obj のランタイム型に基づいて行われます。Callvirt を使用して、仮想メソッドとインスタンス メソッドの両方を呼び出すことができます。callvirt 命令の直前に tail (Tailcall) プリフィックスを置くことによって、制御を転送する前に現在のスタック フレームを解放するように指定できます。呼び出しによって、元のメソッドより信頼性の高いメソッドに制御が転送される場合、スタック フレームは解放されません。
メソッド メタデータ トークンは、呼び出すメソッドの名前、クラス、およびシグネチャを提供します。obj に関連付けられているクラスは、obj がインスタンスであるクラスです。指定したメソッド名とシグネチャに一致する非静的メソッドをクラスが定義している場合は、このメソッドが呼び出されます。それ以外の場合は、このクラスの基本クラス チェインのすべてのクラスが順番にチェックされます。メソッドが見つからない場合は、エラーとなります。
メソッドを呼び出す前に、Callvirt がオブジェクトおよび関連付けられている引数を評価スタックからポップします。メソッドに戻り値がある場合は、メソッドの完了時にスタックに戻り値がプッシュされます。呼び出し先側では、obj パラメータが引数 0 としてアクセスされ、arg1 が引数 1 としてアクセスされ、それ以降も同様にアクセスされます。
引数は、スタック上に左から右に配置されます。つまり、まず最初の引数が計算されてスタックに配置され、次に 2 番目の引数、その次に 3 番目の引数が同様に配置され、最終的に必要なすべての引数が降順でスタックに配置されます。インスタンス参照 obj (callvirt の場合は常に必要) は、ユーザーが参照できる任意の引数の前に、プッシュされる必要があります。(メタデータ トークンで送られる) シグネチャは、このポインタに対するパラメータ リストにエントリを格納する必要はありません。
Call 命令を使用して仮想メソッドを呼び出すこともできます。
obj と関連付けられたクラス内またはその基本クラス内で、指定した名前とシグネチャを持つ非静的メソッドが見つからない場合は、MissingMethodException がスローされます。これは、通常、実行時ではなく、MSIL (Microsoft Intermediate Language) 命令がネイティブ コードに変換されるときに検出されます。
obj が null の場合は、NullReferenceException がスローされます。
システム セキュリティが呼び出し元に対して呼び出すメソッドへのアクセスを許可していない場合は、SecurityException がスローされます。セキュリティ チェックは、実行時ではなく、CIL がネイティブ コードに変換されるときに発生する場合があります。
![]() |
---|
値型に対して System.Object のメソッドを呼び出す場合、callvirt 命令で constrained プリフィックスを使用することを検討してください。これにより、値型がメソッドをオーバーライドするかどうかに応じて異なる IL を出力する必要がなくなるため、バージョン管理の問題が発生する可能性を回避できます。インターフェイス メソッドを実装する値型メソッドは、MethodImpl を使用して変更できるため、値型に対してインターフェイス メソッドを呼び出す場合は、constrained プリフィックスを使用することを検討してください。これらの問題の詳細については、Constrained オペコードに関するトピックに記載されています。 |
callvirt オペコードを使用できる Emit メソッド オーバーロードを次に示します。
-
ILGenerator.Emit(OpCode, MethodInfo)
-
ILGenerator.EmitCall(OpCode, MethodInfo, Type[])

Windows 98, Windows 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。


Weblioに収録されているすべての辞書からOpCodes.Callvirt フィールドを検索する場合は、下記のリンクをクリックしてください。

- OpCodes.Callvirt フィールドのページへのリンク