OpCodes.Call 欄位

定義

呼叫由傳遞的方法描述符所指示的方法。

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

欄位值

備註

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

Format 組裝格式 Description
28 <T> 叫聲 methodDesc 稱為 所 methodDesc描述的方法。

堆疊的過渡行為依序為:

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

  2. 方法arg1參數argN會從堆疊中彈出;方法呼叫會用這些參數執行,控制權則轉移到方法描述符所指的方法。 完成後,被呼叫者的方法會產生一個回傳值並傳送給呼叫者。

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

指令呼叫 call 隨指令傳遞的方法描述符所指示的方法。 方法描述符是一個元資料標記,指示要呼叫的方法、已放置在堆疊上的參數數量、類型和順序,以及要使用該方法的呼叫慣例。 call指令前可緊接tail一個 (Tailcall) 前綴指令,指定在轉移控制權前應釋放目前的方法狀態。 若呼叫將控制權轉移至比原始方法更信任的方法,堆疊框架不會被釋放。 然而,處決卻默默繼續,彷彿根本沒有人提供。tail 中繼資料標記攜帶足夠資訊,以判斷呼叫是靜態方法、實例方法、虛擬方法還是全域函式。 在所有這些情況下,目的位址完全由方法描述符決定(與呼叫虛擬方法的指令不同 Callvirt ,後者的目的位址也取決於先前 Callvirt推送的實例參考的執行時類型)。

參數依左至右排列於堆疊中。 也就是說,先計算第一個參數並放置到堆疊上,接著是第二個參數,接著是第三個參數,直到所有必要的參數依序排列在堆疊頂端。 有三個重要的特殊情況:

  1. 呼叫實例(或虛擬)方法時,必須將該實例引用推送到任何使用者可見的參數之前。 實例參考不能是空參考。 元資料中所攜帶的簽名不包含指標參數列表中 this 的項目;取而代之的是用位元來指示方法是否需要傳遞 this 指標。

  2. 使用 call (而非 callvirt)呼叫虛擬方法是有效的;這表示該方法將以方法指定的類別來解析,而非從被調用物件動態指定的方式。

  3. 請注意,代理 Invoke 的方法可以用 或 callcallvirt 指令來呼叫。

SecurityException 若系統安全未授權呼叫者存取被呼叫的方法,可能會拋出該系統。 安全檢查可能發生在 Microsoft 中間語言(MSIL)指令轉換為原生程式碼時,而非執行時。

Note

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

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

Note

EmitCall此方法用於varargs呼叫。 正常通話時請使用該 Emit 方法。

適用於