OpCodes.Call 欄位
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
呼叫傳遞的方法描述項所指示的方法。
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 描述的方法。 |
堆疊轉換行為會依循序順序為:
透過的方法自變數
arg1
argN
會推送至堆疊。透過的方法自變數
arg1
argN
會從堆疊中快顯;方法呼叫會使用這些自變數執行,而控制權會傳送至方法描述項所參考的方法。 完成時,傳回值是由被呼叫端方法產生,並傳送給呼叫端。傳回值會推送至堆疊。
指令會 call
呼叫以 指令傳遞之方法描述項所指示的方法。 方法描述項是元數據標記,表示呼叫的方法,以及已放置在堆疊上要傳遞至該方法的自變數數目、類型和順序,以及要使用的呼叫慣例。 指令 call
可以緊接 tail
在 (前面) Tailcall 前置詞指令,以指定在傳輸控件之前應該釋放目前的方法狀態。 如果呼叫會將控制權轉移至高於原始方法信任的方法,則不會釋放堆疊框架。 相反地,執行會以無訊息方式繼續,就像 tail
尚未提供 一樣。 元數據令牌具有足夠的資訊,可判斷呼叫是否為靜態方法、實例方法、虛擬方法或全域函式。 在這些情況下,目的地位址完全取決於方法描述元 (與 Callvirt 呼叫虛擬方法的指示相反,其中目的地位址也取決於在) 之前 Callvirt 推送之實例的運行時間類型。
自變數會以由左至右的順序放置在堆疊上。 也就是說,第一個自變數是計算並放置在堆疊上,然後是第二個自變數,第三個自變數,直到所有必要的自變數以遞減順序置於堆棧之上為止。 有三個重要的特殊案例:
呼叫實例 (或虛擬) 方法必須在任何用戶可見自變數之前推送該實例參考。 實例參考不得為 Null 參考。 元數據中所包含的簽章不包含指標參數清單中的
this
專案,而是使用位來指出方法是否需要傳遞this
指標。使用
call
(而非callvirt
) 呼叫虛擬方法是有效的;這表示方法是使用 方法所指定的類別解析,而不是從叫用的物件動態指定。請注意,可以使用 或
callvirt
指令呼叫call
委派的Invoke
方法。
SecurityException 如果系統安全性未授與呼叫端對所呼叫方法的存取權,可能會擲回。 當 Microsoft Intermediate Language (MSIL) 指令轉換成機器碼,而不是在運行時間時,可能會進行安全性檢查。
注意
在實值型別上呼叫 System.Object 的方法時,請考慮使用 constrained
前置詞搭配 callvirt
指令,而不是發出 call
指令。 這會根據實值型別是否覆寫 方法,移除發出不同 IL 的需求,以避免潛在的版本設定問題。 請考慮在 constrained
實值型別上叫用介面方法時使用前置詞,因為實作介面方法的實值型別方法可以使用 來變更 MethodImpl
。 這些問題會在 opcode 中 Constrained 更詳細地描述。
下列 Emit 方法多載可以使用 call
opcode: