共用方式為


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

格式 元件格式 Description
28 <T> 撥電話給 methodDesc 呼叫 所 methodDesc描述的方法。

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

  1. 透過的方法自變數arg1argN會推送至堆疊。

  2. 透過的方法自變數arg1argN會從堆疊中快顯;方法呼叫會使用這些自變數執行,而控制權會傳送至方法描述項所參考的方法。 完成時,傳回值是由被呼叫端方法產生,並傳送給呼叫端。

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

指令會 call 呼叫以 指令傳遞之方法描述項所指示的方法。 方法描述項是元數據標記,表示呼叫的方法,以及已放置在堆疊上要傳遞至該方法的自變數數目、類型和順序,以及要使用的呼叫慣例。 指令 call 可以緊接 tail 在 (前面) Tailcall 前置詞指令,以指定在傳輸控件之前應該釋放目前的方法狀態。 如果呼叫會將控制權轉移至高於原始方法信任的方法,則不會釋放堆疊框架。 相反地,執行會以無訊息方式繼續,就像 tail 尚未提供 一樣。 元數據令牌具有足夠的資訊,可判斷呼叫是否為靜態方法、實例方法、虛擬方法或全域函式。 在這些情況下,目的地位址完全取決於方法描述元 (與 Callvirt 呼叫虛擬方法的指示相反,其中目的地位址也取決於在) 之前 Callvirt 推送之實例的運行時間類型。

自變數會以由左至右的順序放置在堆疊上。 也就是說,第一個自變數是計算並放置在堆疊上,然後是第二個自變數,第三個自變數,直到所有必要的自變數以遞減順序置於堆棧之上為止。 有三個重要的特殊案例:

  1. 呼叫實例 (或虛擬) 方法必須在任何用戶可見自變數之前推送該實例參考。 實例參考不得為 Null 參考。 元數據中所包含的簽章不包含指標參數清單中的 this 專案,而是使用位來指出方法是否需要傳遞 this 指標。

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

  3. 請注意,可以使用 或 callvirt 指令呼叫call委派的 Invoke 方法。

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

注意

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

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

注意

系統會 EmitCallvarargs 呼叫提供方法。 Emit使用方法進行一般呼叫。

適用於