CIL フォーマット
28
(T) / call
(method)
JVM フォーマット
B8
(uint16)/ invokestatic
(index)
※index には、メソッドを参照する ランタイム・コンスタント・プールのアドレスを指定する。
スタック
..., arg1, arg2, ..., argn → ..., retVal (not always returned)
詳細
methodで指定したメソッドを呼び出します。 method はメタデータ・トークン(methodref もしくは methoddef)で表されます。
メタデータ・トークンは呼び出すメソッドに関して十分な情報を持っています。 呼び出し先がstaticメソッド、インスタンス・メソッド、virtualメソッド、 グローバル関数のどれであっても、移動先アドレスは メタデータ・トークンのみで定まります。 実行時の型情報に基づいて移動先を決定するには、 callvirt命令を使います。
メタデータ・トークンで指定されたクラスにメソッドが存在しない場合、 スーパークラスが順に検索されます。
引数は左から右の順でスタックに積みます。 インスタンス・メソッドまたはvirtualメソッドを呼び出す場合、 全ての引数より前に、インスタンス参照(thisポインタ)をスタックに追加します。
virtualメソッドを呼び出してもかまいません。 virtualメソッドであっても、実行時の型によらず methodで指定されたクラスのメソッドが実行されます。 これは、例えば明示的にsuperクラスのメソッドを呼び出す場合などに利用します。
delegate の Invoke メソッドを呼び出す場合は、 call命令を使用してもcallvirt命令を使用しても かまいません。
Exception
呼び出すメソッドに対するアクセス権が現在のメソッドに与えられていない場合、 SecurityException が発生します。