OpCodes.Calli 欄位
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
以呼叫慣例所描述的引數,呼叫在評估堆疊上指示的方法 (做為進入點的指標)。
public: static initonly System::Reflection::Emit::OpCode Calli;
public static readonly System.Reflection.Emit.OpCode Calli;
staticval mutable Calli : System.Reflection.Emit.OpCode
Public Shared ReadOnly Calli As OpCode
欄位值
備註
下表列出指令的十六進位和 Microsoft 中繼語言 (MSIL) 元件格式,以及簡短的參考摘要:
格式 | 元件格式 | Description |
---|---|---|
29 <T > |
愈傷 組織 callSiteDescr |
使用呼叫慣例所描述的自變數呼叫指向 的方法。 |
堆疊轉換行為依循序順序為:
方法
argN
自變數arg1
會推送至堆疊。方法項目指標會推送至堆疊。
透過
argN
的方法自變數arg1
和方法項目指標會從堆疊中彈出;會執行對 方法的呼叫。 完成時,呼叫端方法會產生傳回值,並傳送給呼叫端。傳回值會推送至堆疊。
指令calli
會透過 argN
以自變數arg1
呼叫方法項目指標。 這些自變數的類型是由特定呼叫慣例所描述, (callSiteDesc
) 。
calli
指令可能緊接在tail
前置詞前面 () Tailcall ,以指定在傳輸控件之前應該釋放目前的方法狀態。 如果呼叫將控制權轉移至高於原始方法的方法,則不會釋放堆棧框架;相反地,執行會以無訊息方式繼續,就像尚未提供 一樣 tail
。
方法專案指標假設是目標機器 (的特定指標,) 可以使用呼叫慣例所描述的自變數來合法呼叫, (獨立簽章的元數據令牌) 。 您可以使用 或 Ldvirtftn 指令來建立Ldftn這類指標,或從機器碼傳入。
呼叫慣例不會動態檢查,因此如果目的地實際上未使用指定的呼叫慣例,則使用 calli
指令的程式代碼無法正常運作。
自變數會以由左至右的順序放置在堆疊上。 也就是說,第一個自變數是計算並放在堆疊上,然後是第二個自變數,然後第三個自變數,直到所有必要自變數都以遞減順序停在堆疊上為止。 實例或虛擬方法的自變數建置程式代碼順序必須推送該實例參考 (,該參考不得為 null 參考) 任何使用者可見自變數之前。
SecurityException 如果系統安全性未授與呼叫端對呼叫方法的存取權,可能會擲回。 當 Microsoft 中繼語言 (MSIL) 指令轉換成機器碼,而不是在運行時間時,可能會進行安全性檢查。
下列 EmitCalli 方法可用來對堆疊執行 calli
指令。 請注意, calli
應該透過下列方法呼叫,而不是使用 Emit 類別直接將指令放在堆疊上。
ILGenerator.EmitCalli(OpCode, CallingConventions, Type, Type[], Type[]) 用於使用 Managed 呼叫慣例的呼叫。
ILGenerator.EmitCalli(OpCode, CallingConvention, Type, Type[]) 表示使用 Unmanaged 呼叫慣例的呼叫。