OpCodes.Callvirt 欄位

定義

呼叫物件的晚期綁定方法,將回傳值推送到評估堆疊。

public: static initonly System::Reflection::Emit::OpCode Callvirt;
public static readonly System.Reflection.Emit.OpCode Callvirt;
 staticval mutable Callvirt : System.Reflection.Emit.OpCode
Public Shared ReadOnly Callvirt As OpCode 

欄位值

備註

下表列出指令的十六進位及 Microsoft 中介語言(MSIL)組合格式,並附有簡短參考摘要:

Format 組裝格式 Description
6F <T> 卡爾維特 method 呼叫與 obj相關的特定方法 。

堆疊的過渡行為依序為:

  1. 物件參考 obj 會被推入堆疊。

  2. 方法論證arg1argN會被推送到堆疊中。

  3. 方法參數arg1argN與物件參考obj會從堆疊中彈出;方法呼叫使用這些參數,控制權轉移至方法元資料標記所obj指的方法。 完成後,被呼叫者的方法會產生一個回傳值並傳送給呼叫者。

  4. 回傳值會被推送到堆疊上。

指令 callvirt 呼叫物件上的晚期綁定方法。 也就是說,選擇方法的時值類型是根據 的 obj 執行時類型,而非方法指標中可見的編譯時類別。 Callvirt 可用於呼叫虛擬方法與實例方法。 callvirt指令前可緊接 tailTailcall) 前綴,以指定在轉移控制權前應釋放目前的堆疊框架。 若呼叫將控制權轉移至比原始方法更信任的方法,堆疊框架將不會被釋放。

方法元資料標記提供呼叫方法的名稱、類別與簽章。 所關聯的 obj 類別即為其所屬的實例。 若類別定義了一個非靜態方法,且與指定方法名稱與簽名相符,則呼叫該方法。 否則,該類別基底鏈中的所有類別都會依序檢查。 若找不到方法,則為錯誤。

Callvirt 先將物件及相關參數從評估堆疊中彈出,然後再呼叫該方法。 若方法有回傳值,則在方法完成時會推送至堆疊。 在被叫 obj 方,參數以參數 0、 arg1 參數 1 等方式存取。

參數依左至右排列於堆疊中。 也就是說,先計算第一個參數並放置到堆疊上,接著是第二個參數,接著是第三個參數,直到所有必要的參數依序排列在堆疊頂端。 實例參考 obj (必須 ) callvirt必須推送到任何使用者可見參數之前。 簽章(以元資料標記攜帶)不必包含此指標的參數列表中的條目。

請注意,虛擬方法也可以使用指令 Call 呼叫。

MissingMethodException 當非靜態方法(如指定名稱與簽名)在所 obj 關聯的類別或其基底類別中找不到時,則會拋出 。 這通常是在 Microsoft Intermediate Language(MSIL)指令轉換成原生程式碼時被偵測到,而非執行時。

NullReferenceException 若 obj 為零,則擲出。

SecurityException 當系統安全未授權呼叫者存取被呼叫方法時,會拋出 。 安全檢查可能發生在 CIL 轉換成原生程式碼時,而非執行時。

Note

在呼叫 System.Object 方法於值型別時,考慮在指令callvirt中使用 constrained 前綴。 這消除了根據值型別是否覆蓋方法而發出不同 IL 的需求,避免了潛在的版本控制問題。 在呼叫 value types 的介面方法時,請考慮使用 前constrained綴,因為實作介面方法的值型別方法可以透過 .MethodImpl 這些問題在操作碼中有更詳細 Constrained 的描述。

以下 Emit 方法的超載可使用操作 callvirt 碼:

適用於