OpCodes.Call フィールド
アセンブリ: mscorlib (mscorlib.dll 内)


命令の 16 進数の形式、MSIL (Microsoft Intermediate Language) アセンブリ形式、および簡単な説明の一覧を次の表に示します。
-
メソッド引数の arg1 から argN までがスタックからポップされます。メソッド呼び出しは、これらの引数を使用して実行され、メソッド記述子によって参照されているメソッドに制御が転送されます。完了すると、呼び出し先メソッドによって戻り値が生成され、呼び出し元へ送られます。
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) 命令がネイティブ コードに変換されるときに発生する場合があります。
![]() |
---|
値型に対して System.Object のメソッドを呼び出す場合、call 命令を出力する代わりに、callvirt 命令で constrained プリフィックスを使用することを検討してください。これにより、値型がメソッドをオーバーライドするかどうかに応じて異なる IL を出力する必要がなくなるため、バージョン管理の問題が発生する可能性を回避できます。インターフェイス メソッドを実装する値型メソッドは、MethodImpl を使用して変更できるため、値型に対してインターフェイス メソッドを呼び出す場合は、constrained プリフィックスを使用することを検討してください。これらの問題の詳細については、Constrained オペコードに関するトピックに記載されています。 |
call オペコードを使用できる Emit メソッド オーバーロードを次に示します。
-
ILGenerator.Emit(OpCode, MethodInfo)
-
ILGenerator.EmitCall(OpCode, MethodInfo, Type[])

Windows 98, Windows 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。


Weblioに収録されているすべての辞書からOpCodes.Call フィールドを検索する場合は、下記のリンクをクリックしてください。

- OpCodes.Call フィールドのページへのリンク