CLR VIA C 學習筆記(1)

2021-09-02 03:04:59 字數 2137 閱讀 2918

c# **被編譯器拿去編譯生成il,32位的生成pe32 header,64位 生成pe32+ header. 還有clr header ,metadata , il。

pe32 + ,pe32 header :包含目標平台是64還是32位系統,檔案型別(gui,cui,dll)

clr header:clr 版本,模組大小,資源,簽名等

metadata:型別表,類成員定義等

il: 除metadata定義外的**邏輯,一些方法等,執行期clr會呼叫jit 編譯器編譯il為cpu指令。

metadata其它用途:

1.metadata打包了所有類定義(好比c/c++中的標頭檔案),並和il最終編譯為assembly(dll)

2.metadata為visual studio提供智慧型感知的資料**

3.gc根據metadata的定義決定物件的生命週期

完成了從source code到module的編譯後,第二次編譯會把多個module檔案編譯,用assemblylinker鏈結構成assembly檔案,就是dll或exe。

方法執行前,clr會載入main函式中引用到的型別以及方法,並為其分配乙個初始位址,在jit編譯過程,在生成cpu指令之後,修改這個位址。

注意:jit的過程只在第一次call方法時會觸發,生成了nativeinstruction之後,下次在call 方法,就會直接找到生成好的cpu指令了。

1.根據cpu型別,生成效率較高的指令(例如奔騰和amd)

2.在程式執行時,不斷的對il調優

3.在cpu級別的一些**,直接生成結果,從而優化il。例如if(numberofcpu > 1),jit如果遇到多核環境會生成true,單核生成false

當軟體版本release時,有些debug時生成的il是不需要的,因此可以選擇使用編譯開關(optimize+),visual studio 選擇release就使用了這個開關。會帶來以下好處:

1.移除nop(no operation) 指令 ,主要是一些斷點

2.il檔案會更小,減少workingset

3.不會生成pdb除錯檔案

pdb檔案是debugger用來map il到源**,除錯時才使用。

用途:可以預先把il生成為cpu指令,這樣在執行時,clr找到ngen.exe生成的檔案,就不會觸發jit執行動態編譯,而是直接執行生成好的指令檔案。

好處:1.對於乙個assembly被多個程式共享同時執行的情況,workingset會被減少

2.提高啟動時間

弊端:1.會享受不到一切jit的提供的**優化。

2.如果選擇ngen.exe , 要實時與il編譯時 的以下引數同步:

a.clr版本

b.cpu型別

c.windows版本

d.引用assembly的版本號

.netframework提供了大量的類庫簡化程式設計,有web,service,gui, console ,windows service , library 等等方面。在此就不一一枚舉了。

當基於.net需要多語言混合程式設計時,就需要考慮cts 定義的一些規則了,需要考慮.net平台的其他語言的能力。例如c++支援多繼承,可是混合程式設計的編譯環境會觸發編譯錯誤。

和cts一樣,在基於.net進行多語言混合程式設計時,也要考慮其他語言的能力,例如vb.net中不區分大小寫。

給assembly加上attribute :[assembly:clscompliant(true)] , 就告訴編譯器,這個元件的target是多語言環境,**中可以使用的定義,語法,能力,都是基於.net平台中所有語言都不衝突的,在cls允許範圍內。

CLR via C 學習筆記 型別

類的記憶體分配 關鍵字 abstract 類 該類不能構建例項 方法 屬性 事件 表示構建派生型別的例項之前派生型別必須重寫並實現這個成員 常量 字段 不允許 virtual 類 不允許 方法 屬性 事件 表示這個成員可以由派生類重寫 常量 字段 不允許 override 類 不允許 方法 屬性 事...

CLR Via C 學習筆記之CLR的執行模型

1 公共語言執行時 common language runtime,clr 是乙個可由多種程式語言使用的 執行時 clr的核心功能 比如記憶體管理 程式集載入 安全性 異常處理和執行緒同步 可由面向clr的所有語言使用 2 c 源 檔案 c 編譯器 託管模組 中間語言il和元資料 無論選用哪個編譯器...

CLR via C 讀書筆記1 9

與非託管 的互操作 clr 提供3種與非託管 的互動方案 託管 通過使用 p invoke 機制 來呼叫dll檔案中的非託管函式 許多 fcl 中定義的型別內部都有呼叫到 kernel32.dll,user32.dll 等等檔案中的函式。同時許多程式語言會提供託管 呼叫非託管 的簡便途徑,比如 c ...