次の方法で共有


OpCodes.Call フィールド

渡されたメソッド記述子によって示されているメソッドを呼び出します。

Public Shared ReadOnly Call As OpCode
[C#]
public static readonly OpCode Call;
[C++]
public: static OpCode Call;
[JScript]
public static var Call : OpCode;

解説

命令の 16 進数の形式、MSIL (Microsoft Intermediate Language) アセンブリ形式、および簡単な説明の一覧を次の表に示します。

形式 アセンブリ形式 説明
28 < T > call methodDesc methodDesc によって記述されているメソッドを呼び出します。

スタックの遷移動作を順番に示すと、次のようになります。

  1. メソッド引数の arg1 から argN までがスタックにプッシュされます。
  2. メソッド引数の arg1 から argN までがスタックからポップされます。メソッド呼び出しは、これらの引数を使用して実行され、メソッド記述子によって参照されているメソッドに制御が転送されます。完了すると、呼び出し先メソッドによって戻り値が生成され、呼び出し元へ送られます。
  3. 戻り値がスタックにプッシュされます。

call 命令は、命令と共に渡されたメソッド記述子によって示されているメソッドを呼び出します。メソッド記述子は、メタデータ トークンです。このメタデータ トークンは、呼び出すメソッドとそのメソッドに渡されるためにスタックに配置された引数の数、型、順序、および使用される呼び出し規約を示します。 call 命令の直前に tail (Tailcall) プリフィックス命令を置くことによって、制御を転送する前に現在のメソッドの状態を解放するように指定できます。呼び出しによって、元のメソッドより信頼性の高いメソッドに制御が転送される場合、スタック フレームは解放されません。この場合、tail が提供されなかったかのように、実行が継続されます。メタデータ トークンには、呼び出しが静的メソッド、インスタンス メソッド、仮想メソッド、グローバル関数のいずれであるかを確認できる情報があります。どの場合も、エンド ポイント アドレスは、メソッド記述子から判断されます。これに対して Callvirt 命令で仮想メソッドを呼び出す場合は、エンド ポイント アドレスは Callvirt の前にプッシュされたインスタンス参照のランタイム型にも依存します。

引数は、スタック上に左から右に配置されます。つまり、まず最初の引数が計算されてスタックに配置され、次に 2 番目の引数、その次に 3 番目の引数が同様に配置され、最終的に必要なすべての引数が降順でスタックに配置されます。次に、重要な意味を持つ特殊な 3 つの例を示します。

1. インスタンス メソッドまたは仮想メソッドの呼び出しは、ユーザーが参照できる任意の引数の前に、そのインスタンス参照をプッシュする必要があります。インスタンス参照は、null 参照以外である必要があります。メタデータで送られるシグネチャには、this ポインタのためのパラメータ リストのエントリは含まれていません。シグネチャは、1 ビットを使用して、メソッドが this ポインタを渡すことを要求しているかどうかを示します。

2. callvirt ではなく call を使用した仮想メソッドの呼び出しは有効です。この方法で呼び出すと、メソッドは、呼び出されるオブジェクトから動的に指定されたクラスではなく、メソッドによって指定されたクラスを使用して解決されます。

3. デリゲートの Invoke メソッドは、 call 命令または callvirt 命令で呼び出すことができます。

システム セキュリティが呼び出し元に対して呼び出すメソッドへのアクセスを許可していない場合は、 SecurityException がスローされることがあります。セキュリティ チェックは、実行時ではなく、MSIL (Microsoft Intermediate Language) 命令がネイティブ コードに変換されるときに発生する場合があります。

call オペコードを使用できる Emit コンストラクタ オーバーロードを次に示します。

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

必要条件

プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ

参照

OpCodes クラス | OpCodes メンバ | System.Reflection.Emit 名前空間