OpCodes.Callvirt フィールドとは? わかりやすく解説

Weblio 辞書 > コンピュータ > .NET Framework クラス ライブラリ リファレンス > OpCodes.Callvirt フィールドの意味・解説 

OpCodes.Callvirt フィールド

オブジェクト上で遅延バインディング メソッド呼び出し戻り値評価スタックプッシュます。

名前空間: System.Reflection.Emit
アセンブリ: mscorlib (mscorlib.dll 内)
構文構文

解説解説

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

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

  1. オブジェクト参照 objスタックプッシュされます

  2. メソッド引数arg1 から argN までがスタックプッシュされます

  3. メソッド引数arg1 から argN まで、およびオブジェクト参照 obj が、スタックからポップされますメソッド呼び出しは、これらの引数使用して実行されメソッド メタデータ トークンによって参照される obj 内のメソッド制御転送されます。完了すると、呼び出しメソッドによって戻り値生成され呼び出し元へ送られます。

  4. 戻り値スタックプッシュされます

callvirt 命令は、オブジェクト上で遅延バインディング メソッド呼び出します。つまり、メソッド選択は、メソッド ポインタ参照できるコンパイルクラスではなくobjランタイム型に基づいて行われますCallvirt使用して仮想メソッドインスタンス メソッド両方呼び出すことができますcallvirt 命令直前tail (Tailcall) プリフィックスを置くことによって、制御転送する前に現在のスタック フレーム解放するように指定できます呼び出しによって、元のメソッドより信頼性の高いメソッド制御転送される場合スタック フレーム解放されません。

メソッド メタデータ トークンは、呼び出すメソッドの名前、クラス、およびシグネチャ提供しますobj関連付けられているクラスは、objインスタンスであるクラスです。指定したメソッド名とシグネチャ一致する静的メソッドクラス定義している場合は、このメソッド呼び出されます。それ以外場合は、このクラス基本クラス チェインすべてのクラス順番チェックされます。メソッドが見つからない場合は、エラーとなります

メソッド呼び出す前にCallvirtオブジェクトおよび関連付けられている引数評価スタックからポップます。メソッド戻り値がある場合は、メソッド完了時にスタック戻り値プッシュされます呼び出し先側では、obj パラメータ引数 0 としてアクセスされ、arg1引数 1 としてアクセスされ、それ以降同様にアクセスされます

引数は、スタック上に左から右に配置されます。つまり、まず最初引数計算されスタック配置され次に 2 番目の引数、その次に 3 番目の引数同様に配置され最終的に必要なすべての引数降順スタック配置されます。インスタンス参照 obj (callvirt場合は常に必要) は、ユーザー参照できる任意の引数前にプッシュされる必要があります。(メタデータ トークン送られる) シグネチャは、このポインタ対すパラメータ リストにエントリを格納する要はありません。

Call 命令使用して仮想メソッド呼び出すこともできます

obj関連付けられたクラス内またはその基本クラス内で、指定した名前とシグネチャを持つ非静的メソッドが見つからない場合は、MissingMethodException がスローさます。これは、通常実行時ではなくMSIL (Microsoft Intermediate Language) 命令ネイティブ コード変換されるときに検出されます。

objnull場合は、NullReferenceException がスローさます。

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

メモメモ

値型に対して System.Object のメソッド呼び出す場合callvirt 命令constrained プリフィックス使用することを検討してください。これにより、値型メソッドオーバーライドするかどうかに応じて異なIL出力する必要がなくなるため、バージョン管理問題発生する可能性回避できますインターフェイス メソッド実装する値型メソッドは、MethodImpl使用して変更できるため、値型に対してインターフェイス メソッド呼び出す場合は、constrained プリフィックス使用することを検討してください。これらの問題詳細については、Constrained オペコードに関するトピック記載されています。

callvirt オペコード使用できる Emit メソッド オーバーロード次に示します

  • ILGenerator.Emit(OpCode, MethodInfo)

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

プラットフォームプラットフォーム
バージョン情報バージョン情報
参照参照
関連項目
OpCodes クラス
OpCodes メンバ
System.Reflection.Emit 名前空間



英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

OpCodes.Callvirt フィールドのお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



OpCodes.Callvirt フィールドのページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
日本マイクロソフト株式会社日本マイクロソフト株式会社
© 2024 Microsoft.All rights reserved.

©2024 GRAS Group, Inc.RSS