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) 元件格式,以及簡短的參考摘要:

格式 元件格式 Description
6F <T> callvirt method 呼叫與 obj相關聯的特定方法。

堆疊轉換行為依循序順序為:

  1. 對象參考 obj 會推送至堆疊。

  2. 方法argN自變數arg1會推送至堆疊。

  3. 透過 argN 和 對象參考obj的方法自變數arg1會從堆疊中快顯;方法呼叫會以這些自變數執行,且控件會傳送至方法元數據標記所參考的方法obj。 完成時,呼叫端方法會產生傳回值,並傳送給呼叫端。

  4. 傳回值會推送至堆疊。

指令 callvirt 會在物件上呼叫晚期綁定方法。 也就是說,系統會根據的 obj 運行時間類型來選擇方法,而不是方法指標中可見的編譯時間類別。 Callvirt 可用來呼叫虛擬和實例方法。 callvirt指令前面可能會緊接 tail (Tailcall) 前置詞,以指定在傳輸控件之前應該釋放目前的堆疊框架。 如果呼叫會將控制權轉移至高於原始方法的方法,則不會釋放堆疊框架。

方法元數據令牌會提供要呼叫之方法的名稱、類別和簽章。 與相關聯的 obj 類別是其為 實例的類別。 如果 類別定義符合指定之方法名稱和簽章的非靜態方法,則會呼叫這個方法。 否則,會依序檢查此類別之基類鏈結中的所有類別。 如果找不到任何方法,就會發生錯誤。

Callvirt 先從評估堆疊取出 對象和相關聯的自變數,然後再呼叫 方法。 如果方法有傳回值,則會在方法完成時推送至堆疊。 在被呼叫端, obj 參數會以自變數 0 存取, arg1 做為自變數 1 等。

自變數會以由左至右的順序放置在堆疊上。 也就是說,第一個自變數是計算並放在堆疊上,然後是第二個自變數,然後第三個自變數,直到所有必要自變數都以遞減順序停在堆疊上為止。 實例參考 obj () 一律必須在 callvirt 任何用戶可見自變數之前推送。 元數據令牌中 (的簽章) 不需要在此指標的參數清單中包含專案。

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

MissingMethodException 如果在與 或任何基類相關聯類別 obj 中找不到具有指定名稱與簽章的非靜態方法,則會擲回 。 當 Microsoft Intermediate Language (MSIL) 指令轉換成機器碼,而不是在運行時間時,通常會偵測到此情況。

NullReferenceException 如果 obj 為 null,則會擲回 。

SecurityException 如果系統安全性未授與呼叫端對呼叫方法的存取權,則會擲回 。 當 CIL 轉換成機器碼,而不是在運行時間時,可能會進行安全性檢查。

注意

在實值型別上呼叫 System.Object 的方法時,請考慮搭配指示使用 constrained 前置詞 callvirt 。 這會根據實值類型是否覆寫 方法,移除發出不同 IL 的需求,以避免潛在的版本設定問題。 請考慮在實值型別上叫用介面方法時使用 constrained 前置詞,因為實作介面方法的值型別方法可以使用 來變更 MethodImpl。 Opcode 會更詳細 Constrained 地說明這些問題。

下列 Emit 方法多載可以使用 callvirt opcode:

適用於