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 ...