OpCodes.Call OpCodes.Call OpCodes.Call OpCodes.Call Field


渡されたメソッド記述子によって示されているメソッドを呼び出します。Calls the method indicated by the passed method descriptor.

public: static initonly System::Reflection::Emit::OpCode Call;
public static readonly System.Reflection.Emit.OpCode Call;
 staticval mutable Call : System.Reflection.Emit.OpCode
Public Shared ReadOnly Call 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
28 < T >28 < T > 呼び出し methodDesccall methodDesc 説明したメソッドを呼び出すmethodDescします。Call the method described by methodDesc.

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

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

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

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

call命令は、命令に渡されたメソッド記述子によって示されるメソッドを呼び出します。The call instruction calls the method indicated by the method descriptor passed with the instruction. メソッドの記述子は、メソッドの呼び出し数、型、および使用する呼び出し規則とそのメソッドに渡されるスタック上に格納された引数の順序を示すメタデータ トークンです。The method descriptor is a metadata token that indicates the method to call and the number, type, and order of the arguments that have been placed on the stack to be passed to that method as well as the calling convention to be used. call命令のすぐ前に、 tail (Tailcall) メソッドの現在の状態が制御を転送する前にリリースされることを指定する命令のプレフィックスします。The call instruction can be immediately preceded by a tail (Tailcall) prefix instruction to specify that the current method state should be released before transferring control. 呼び出し元のメソッドよりも信頼性の高いメソッドに制御を転送、スタック フレームは解放されません。If the call transfers control to a method of higher trust than the origin method, the stack frame is not released. 代わりに、実行が継続として、tailが提供されています。Instead, the execution continues silently as if the tail had not been supplied. メタデータ トークンには、呼び出しが静的メソッド、インスタンス メソッド、仮想メソッド、またはグローバル関数かどうかを判断するための十分な情報。The metadata token carries sufficient information to determine whether the call is to a static method, an instance method, a virtual method, or a global function. 送信先アドレスは、メソッドの記述子から判断これらすべてのケース (これと対照的に、Callvirt命令の仮想メソッドの呼び出しで宛先のアドレスもインスタンスの実行時の型によって異なります。参照がプッシュする前に、 Callvirt)。In all of these cases the destination address is determined entirely from the method descriptor (contrast this with the Callvirt instruction for calling virtual methods, where the destination address also depends upon the runtime type of the instance reference pushed before the Callvirt).

引数は、左から右の順序でスタックに配置されます。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. 次の 3 つの重要な特殊なケースがあります。There are three important special cases:

  1. 呼び出しインスタンス (または仮想) メソッドが任意のユーザーに表示される引数の前にそのインスタンスの参照をプッシュする必要があります。Calls to an instance (or virtual) method must push that instance reference before any of the user-visible arguments. インスタンスの参照は null 参照にはできません。The instance reference must not be a null reference. メタデータでシグネチャのパラメーター リスト内のエントリを含まない、thisポインターをメソッドに渡すことが必要かどうかを示すために、1 ビットを使用して、代わりに、thisポインター。The signature carried in the metadata does not contain an entry in the parameter list for the this pointer; instead, it uses a bit to indicate whether the method requires passing the this pointer.

  2. 使用して、仮想メソッドを呼び出すことはcall(なくcallvirt)。 これは、メソッドが呼び出されているオブジェクトから動的に指定ではなく、メソッドによって指定されたクラスを使用して解決することを示します。It is valid to call a virtual method using call (rather than callvirt); this indicates that the method is to be resolved using the class specified by method rather than as specified dynamically from the object being invoked.

  3. なお、デリゲートのInvokeいずれかでメソッドを呼び出すことができます、callまたはcallvirt命令。Note that a delegate's Invoke method can be called with either the call or callvirt instruction.

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


値の型で System.Object のメソッドを呼び出すときに、使用を検討して、constrainedプレフィックスを追加、callvirt命令の出力ではなく、call命令。When calling methods of System.Object on value types, consider using the constrained prefix with the callvirt instruction instead of emitting a call 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メソッドのオーバー ロードを使用できる、 call opcode:The following Emit method overloads can use the call opcode:

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

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


EmitCallメソッドが提供varargs呼び出し。The EmitCall method is provided for varargs calls. 使用して、Emit通常の呼び出しのメソッド。Use the Emit method for normal calls.