OpCodes.Callvirt OpCodes.Callvirt OpCodes.Callvirt OpCodes.Callvirt Field

定義

オブジェクト上で遅延バインディング メソッドを呼び出し、戻り値を評価スタックにプッシュします。Calls a late-bound method on an object, pushing the return value onto the evaluation stack.

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) アセンブリの形式を示します。The following table lists the instruction's hexadecimal and Microsoft Intermediate Language (MSIL) assembly format, along with a brief reference summary:

形式Format アセンブリの形式Assembly Format 説明Description
6F < T >6F < T > callvirt methodcallvirt method 関連付けられている特定のメソッドを呼び出してobjします。Calls a specific method associated with obj.

履歴の移行動作を順番には。The stack transitional behavior, in sequential order, is:

  1. オブジェクト参照objがスタックにプッシュされます。An object reference obj is pushed onto the stack.

  2. メソッドの引数arg1を通じてargNスタックにプッシュされます。Method arguments arg1 through argN are pushed onto the stack.

  3. メソッドの引数arg1を通じてargNとオブジェクト参照objスタックからポップされますこれらの引数でメソッドの呼び出しが実行されると、メソッドに制御が移りますobjメソッドが参照するには。メタデータ トークン。Method arguments arg1 through argN and the object reference obj are popped from the stack; the method call is performed with these arguments and control is transferred to the method in obj referred to by the method metadata token. 完了すると、戻り値が呼び出し先メソッドによって生成され、呼び出し元に送信します。When complete, a return value is generated by the callee method and sent to the caller.

  4. 戻り値は、スタックにプッシュされます。The return value is pushed onto the stack.

callvirt命令は、オブジェクトの遅延バインディング メソッドを呼び出します。The callvirt instruction calls a late-bound method on an object. つまり、メソッドのランタイム型に基づいて選択objメソッドのポインターに表示される、コンパイル時クラスではなく。That is, the method is chosen based on the runtime type of obj rather than the compile-time class visible in the method pointer. Callvirt 仮想両方を呼び出すし、インスタンス メソッドを使用できます。Callvirt can be used to call both virtual and instance methods. callvirt命令ではすぐに付くことがあります、 tail (Tailcall) プレフィックスを制御を転送する前に、現在のスタック フレームを解放する必要があるかを指定します。The callvirt instruction may be immediately preceded by a tail (Tailcall) prefix to specify that the current stack frame should be released before transferring control. 呼び出しが転送される場合、スタック フレームの元のメソッドよりも信頼性の高いメソッドに制御は解放されません。If the call would transfer control to a method of higher trust than the original method the stack frame will not be released.

メソッドのメタデータ トークンでは、名前とクラスを呼び出すメソッドのシグネチャを提供します。The method metadata token provides the name, class and signature of the method to call. 関連付けられているクラスobjは、クラスがインスタンスです。The class associated with obj is the class of which it is an instance. クラスには、示されたメソッドの名前とシグネチャに一致する非静的メソッドが定義されている場合は、このメソッドが呼び出されます。If the class defines a non-static method that matches the indicated method name and signature, this method is called. それ以外の場合、このクラスの基底クラス チェーン内のすべてのクラスは順番にチェックします。Otherwise all classes in the base class chain of this class are checked in order. メソッドが見つからない場合は、エラーです。It is an error if no method is found.

Callvirt メソッドを呼び出す前に、オブジェクトと関連付けられている引数を評価スタックをポップします。Callvirt pops the object and the associated arguments off the evaluation stack before calling the method. メソッドの戻り値の場合は、メソッドの完了時にスタックにプッシュされます。If the method has a return value, it is pushed on the stack upon method completion. 呼び出し側で、objパラメーターが 0 で、引数としてアクセスされるarg1引数 1 という具合にします。On the callee side, the obj parameter is accessed as argument 0, arg1 as argument 1, and so on.

引数は、左から右の順序でスタックに配置されます。The arguments are placed on the stack in left-to-right order. つまり、最初の引数が計算され、まで、降順でスタックの一番上のすべての必要な引数がスタックし、2 番目の引数は 3 番目の配置。That is, the first argument is computed and placed on the stack, then the second argument, then the third, until all necessary arguments are atop the stack in descending order. インスタンス参照obj(常に必要なcallvirt) 任意のユーザーに表示される引数の前にプッシュする必要があります。The instance reference obj (always required for callvirt) must be pushed before any of the user-visible arguments. 署名 (メタデータ トークンに含まれる) 必要があります、このパラメーター リスト内のエントリを含まないポインター。The signature (carried in the metadata token) need not contain an entry in the parameter list for the this pointer.

仮想メソッドも呼び出すことができますを使用してに注意してください、Call命令。Note that a virtual method can also be called using the Call instruction.

MissingMethodException 関連付けられているクラスで指定した名前およびシグネチャを持つ非静的メソッドが見つかりませんだった場合にスローされるobjまたはその基本クラスのいずれか。MissingMethodException is thrown if a non-static method with the indicated name and signature could not be found in the class associated with obj or any of its base classes. これは、通常、Microsoft 中間言語 (MSIL) 命令が実行時ではなく、ネイティブ コードに変換された場合に検出します。This is typically detected when Microsoft Intermediate Language (MSIL) instructions are converted to native code, rather than at runtime.

NullReferenceException obj が null の場合にスローされます。NullReferenceException is thrown if obj is null.

SecurityException システムのセキュリティは、呼び出されたメソッドを呼び出し元アクセスを許可していない場合にスローされます。SecurityException is thrown if system security does not grant the caller access to the called method. セキュリティ チェックは、実行時ではなくネイティブ コードに CIL を変換するときに発生する可能性があります。The security check may occur when the CIL is converted to native code rather than at run time.

注意

値の型で System.Object のメソッドを呼び出すときに、使用を検討して、constrainedプレフィックスを追加、callvirt命令。When calling methods of System.Object on value types, consider using the constrained prefix with the callvirt instruction. これには、潜在的なバージョン管理の問題を回避する値の型がメソッドをオーバーライドするかどうかに応じてさまざまな IL を生成する必要が削除されます。This removes the need to emit different IL depending on whether or not the value type overrides the method, avoiding a potential versioning problem. 使用を検討して、constrainedため値型のメソッドがインターフェイス メソッドの実装で、値の型のインターフェイス メソッドを呼び出すときにプレフィックスの変更を使用して、 MethodImplConsider using the constrained prefix when invoking interface methods on value types, since the value type method implementing the interface method can be changed using a MethodImpl. これらの問題がで詳しく説明されている、 Constrained opcode です。These issues are described in more detail in the Constrained opcode.

Emitメソッドのオーバー ロードを使用できる、 callvirt opcode:The following Emit method overload can use the callvirt opcode:

  • ILGenerator.Emit (オペコード、MethodInfo)ILGenerator.Emit(OpCode, MethodInfo)

  • ILGenerator.EmitCall(OpCode, MethodInfo, Type[])ILGenerator.EmitCall(OpCode, MethodInfo, Type[])

適用対象