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使用 方法進行一般呼叫。

適用於