OpCodes.Callvirt 欄位
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
在物件上呼叫晚期繫結方法,將傳回值推送至評估堆疊。
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 相關聯的特定方法。 |
堆疊轉換行為依循序順序為:
對象參考
obj
會推送至堆疊。方法
argN
自變數arg1
會推送至堆疊。透過
argN
和 對象參考obj
的方法自變數arg1
會從堆疊中快顯;方法呼叫會以這些自變數執行,且控件會傳送至方法元數據標記所參考的方法obj
。 完成時,呼叫端方法會產生傳回值,並傳送給呼叫端。傳回值會推送至堆疊。
指令 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: