天天看點

【Emit基礎】IL定義方法的文法詳解

     在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)調用。

繼續閱讀