在IL中,方法的定義文法:
.method <flags> <call_conv> <ret_type> <name>(<arg_list>) <impl>
{
<method_body>
}
一.Flags部分可設定
1.可通路性
privatescope: 該方法不能被引用。
private: 該方法隻能被自身及其嵌套類型調用。
famandassem: 該方法隻能被目前程式集内部的繼承類型調用。(internal and protected)
assembly: 該方法隻能被程式集内部成員調用。
family: 該方法隻能被繼承類型調用。
famorassem: 該方法可以被程式集内部成員或外部繼承類型調用。(internal or protected)
public: 公共方法。
2. Contract
static: 靜态方法。
final: 不能被 override 的方法。
virtual: 虛方法,不能和 static 同時使用。
hidebysig: 該方法對繼承類型隐藏。該标記僅提供給編譯器使用,但會被 CLR 忽略。
3. Vitual method table (v-table) control flags
newslot: 必須和 virtual 一起使用,添加該關鍵字的虛方法不會 override 基類中同名(含簽名)虛方法,而是在 v-table 中建立一個新槽(new slot)。
4. Implementation
abstract: 抽象方法,不提供實作代碼。其 RVA = 0,任何擁有抽象方法的類型必須添加 abstract 成為抽象類型。
specialname: 該方法名有特殊含義,如 .cctor、.ctor 等。
pinvokeimpl: 該方法是非托管方法,通過 P/Invoke 封裝調用。
5. Reserved
rtspecialname: 該方法擁有 CLR 内部使用的特殊名稱,必須和 specialname 一起使用。
二. Implementation Flags
1. Code type
cil: 該方法由 CIL (common intermediate language) 實作。(預設)
native: 該方法由 native code 實作。
runtime: 該方法由 CLR 自動生成。隻有 mscorlib.dll 中的某些方法帶有此标記。
2. Code management
managed: 托管代碼。(預設)
unmanaged: 非托管代碼,必須和 native 一起使用。
3. Implementation and interoperability
internalcall: 内部使用标記。
synchronized: 訓示 JIT 自動為其插入同步代碼,以保證多線程調用安全。在 C# 中我們為方法添加 [MethodImpl(MethodImplOptions.Synchronized)] 特性時,編譯器就會為該方法添加該标記。對于執行個體方法而言,自動插入代碼會鎖定執行個體對象引用;而靜态方法,會鎖定其所在類型的靜态類型對象(System.Type)。
noinlining: 禁止内聯(inline)調用。