OpCodes.Call フィールド
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
渡されたメソッド記述子によって示されているメソッドを呼び出します。
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) アセンブリ形式と、簡単な参照の概要を示します。
形式 | アセンブリ形式 | 説明 |
---|---|---|
28 <T > |
methodDesc を呼び出します |
で methodDesc 記述されているメソッドを呼び出します。 |
スタック遷移の動作は、順番に次のようになります。
を介した
arg1
argN
メソッド引数は、スタックにプッシュされます。を介した
argN
メソッド引数arg1
はスタックからポップされます。メソッド呼び出しは、これらの引数を使用して実行され、制御はメソッド記述子によって参照されるメソッドに転送されます。 完了すると、戻り値が呼び出し先メソッドによって生成され、呼び出し元に送信されます。戻り値はスタックにプッシュされます。
命令は call
、 命令で渡されたメソッド記述子によって示されるメソッドを呼び出します。 メソッド記述子は、呼び出すメソッドと、そのメソッドに渡されるスタックに配置された引数の番号、型、順序、および使用する呼び出し規則を示すメタデータ トークンです。 命令のcall
直前に (Tailcall) プレフィックス命令をtail
付けて、制御を転送する前に現在のメソッドの状態を解放するように指定できます。 呼び出しによって制御が配信元メソッドよりも高い信頼のメソッドに転送された場合、スタック フレームは解放されません。 代わりに、 が指定されていないかのように tail
、実行はサイレントに続行されます。 メタデータ トークンには、呼び出しが静的メソッド、インスタンス メソッド、仮想メソッド、またはグローバル関数のいずれに対して行われるかを判断するのに十分な情報が格納されます。 いずれの場合も、宛先アドレスはメソッド記述子から完全に決定されます (これは仮想メソッドを呼び出すための命令と Callvirt 対照的です。宛先アドレスは、 の前に Callvirtプッシュされたインスタンス参照のランタイム型にも依存します)。
引数は、左から右の順序でスタックに配置されます。 つまり、最初の引数が計算されてスタックに配置され、次に 2 番目の引数、次に 3 番目の引数が、必要なすべての引数が降順でスタックの上に配置されます。 3 つの重要な特殊なケースがあります。
インスタンス (または仮想) メソッドの呼び出しでは、ユーザーが参照できる引数の前にそのインスタンス参照をプッシュする必要があります。 インスタンス参照を null 参照にすることはできません。 メタデータで実行されるシグネチャには、ポインターのパラメーター リスト
this
にエントリが含まれていません。代わりに、メソッドがポインターを渡す必要があるかどうかを示すためにビットをthis
使用します。(ではなく
callvirt
) を使用してcall
仮想メソッドを呼び出すと有効です。これは、呼び出されるオブジェクトから動的に指定されるのではなく、メソッドで指定されたクラスを使用してメソッドを解決することを示します。デリゲートの
Invoke
メソッドは、 またはcallvirt
命令をcall
使用して呼び出すことができます。
SecurityException システム セキュリティが呼び出し元に呼び出し元のメソッドへのアクセスを許可しない場合にスローされる可能性があります。 セキュリティ チェックは、Microsoft Intermediate Language (MSIL) 命令が実行時ではなくネイティブ コードに変換されるときに発生する可能性があります。
注意
値型で System.Object のメソッドを呼び出す場合は、命令を constrained
出力する代わりに、プレフィックスを callvirt
命令と共に call
使用することを検討してください。 これにより、値の型がメソッドをオーバーライドするかどうかに応じて異なる IL を出力する必要がなくなります。これにより、バージョン管理の問題が発生する可能性があります。 インターフェイス メソッドを constrained
実装する値型メソッドは を使用して変更できるため、値型でインターフェイス メソッドを呼び出すときにプレフィックスを使用 MethodImpl
することを検討してください。 これらの問題については、オペコードで Constrained 詳しく説明されています。
次 Emit のメソッド オーバーロードでは、オペコードを call
使用できます。
適用対象
.NET