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 @No__t-0 に関連付けられた特定のメソッドを呼び出します。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 がスタックからポップされます。メソッドの呼び出しは、これらの引数を使用して実行され、メソッドのメタデータトークンによって参照される @no__t 3 のメソッドに制御が移ります。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.

@No__t-0 命令は、オブジェクトに対して遅延バインディングメソッドを呼び出します。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. @No__t-0 命令は、コントロールを転送する前に現在のスタックフレームを解放する必要があることを指定するために、直前に 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. @No__t-0 に関連付けられているクラスは、インスタンスとして使用されているクラスです。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として、@no__t 引数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. インスタンス参照 (callvirt の場合は常に必須) @no__t は、ユーザーが参照できる任意の引数の前にプッシュする必要があります。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.

@No__t-0 命令を使用して仮想メソッドを呼び出すこともできます。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.

obj が null の場合、NullReferenceException がスローされます。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 のメソッドを呼び出すときは、callvirt 命令と共に @no__t 0 プレフィックスを使用することを検討してください。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. インターフェイスメソッドを実装する値型のメソッドは、MethodImpl を使用して変更できるため、値型に対してインターフェイスメソッドを呼び出すときは、@no__t 0 プレフィックスを使用することを検討してください。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[])

適用対象