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 中間言語 (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.

NullReferenceExceptionobj が 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実装する値型のメソッドはをMethodImpl使用して変更できるため、値型に対してインターフェイスメソッドを呼び出すときは、プレフィックスを使用することを検討してください。Consider 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 、「オペコード」を参照してください。These issues are described in more detail in the Constrained opcode.

Emitのメソッドオーバーロードでは、 callvirtオペコードを使用できます。The following Emit method overload can use the callvirt opcode:

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

  • ILGenerator EmitCall (オペコード、MethodInfo、型 [])ILGenerator.EmitCall(OpCode, MethodInfo, Type[])

適用対象