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)組合格式,並附有簡短參考摘要:
| Format | 組裝格式 | Description |
|---|---|---|
29 <T> |
卡莉 callSiteDescr |
呼叫指向的方法,並以呼叫慣例描述的參數。 |
堆疊的過渡行為依序為:
方法論證
arg1argN會被推送到堆疊中。方法的入口指標會被推送到堆疊上。
方法參數
arg1argN與方法入口指標會從堆疊中彈出;執行對該方法的呼叫。 完成後,被呼叫者的方法會產生一個回傳值並傳送給呼叫者。回傳值會被推送到堆疊上。
指令 calli 呼叫方法的入口指標,參數為 arg1argN。 這些參數的類型由特定的呼叫慣例callSiteDesc()描述。
calli指令前可緊接tail前綴(Tailcall),以指定在轉移控制權前必須釋放目前的方法狀態。 若呼叫將控制權轉移給比原始方法更信任的方法,堆疊框架將不會被釋放;相反地,處決會像沒有被供應一樣默 tail 默繼續。
方法入口指標假設為指向目標機器原生程式碼的特定指標,且可合法呼叫呼叫參數(獨立簽章的元資料標記)。 這類指標可以用 or Ldftn 指令建立Ldvirtftn,或是從原生程式碼傳遞。
呼叫慣例不會動態檢查,因此如果目的指令沒有實際使用指定的呼叫慣例,該程式碼 calli 就無法正常運作。
參數依左至右排列於堆疊中。 也就是說,先計算第一個參數並放置到堆疊上,接著是第二個參數,接著是第三個參數,直到所有必要的參數依序排列在堆疊頂端。 實例或虛擬方法的參數建構程式碼序列必須在任何使用者可見參數之前推送該實例參考(該參考不得為空參考)。
SecurityException 若系統安全未授權呼叫者存取被呼叫的方法,可能會拋出該系統。 安全檢查可能發生在將 Microsoft 中介語言(MSIL)指令轉換為原生程式碼時,而非執行時。
EmitCalli以下方法可用於對堆疊執行calli指令。 請注意, calli 應透過以下方法呼叫,而非直接使用 Emit 類別將指令放入堆疊。
ILGenerator.EmitCalli(OpCode, CallingConventions, Type, Type[], Type[]) 用於使用管理呼叫慣例的通話。
ILGenerator.EmitCalli(OpCode, CallingConvention, Type, Type[]) 用於使用非管理呼叫慣例的通話。