( 聲明:本系列只想給大家介紹.net框架,并不是語法和類的使用的講解,所以只能概括的描述一下所提到的類,如果有疑問可以到MSDN上面去查 )
眾所周知,DotNet框架是非常龐大的,光項目創建時的種類就有WPF,WCF,WF這三種最新的技術,還有以前的Web,WinForm,Service,Mobile等等.
這么復雜和龐大的框架,用文字來描述是遠遠不夠的,所以我準備寫一系列圖文并茂的文章,把我所知道的所有Net框架中的東西全部串聯起來,希望可以給大家一個DotNet框架的知識圖,本人能力有限,難免有理解錯誤和表達不清的地方,望大家諒解并指教.
好,我們現在就開始第一張圖的學習,再所有的文章寫完后,大家將會得到一個完整的框架圖。
下面我會做出對這個圖的解釋,請大家對照圖來一步一步的學習。
1.CTS 和 CLS :
CTS:公共類型系統。他是一個集合{類,接口,委托,結構,枚舉,類型成員,基本數據類型},只有符合CTS的類型才能在CLR上運行。簡單點說就是VB,C#,C++等DotNet支持的語言的類型集合。這些東西大部分都定義在System.dll中,我們將在下一篇來討論system.dll。
CLS:公共語言規范。從圖上可以看出,他是CTS的子集,為什么他是子集呢?因為在C#中有Ulong而VB中就沒有??匆韵麓a













在默認.NET開發平臺上是不會執行CLS檢查的,如果要開啟可以在
AssemblyInfo.cs
中加入代碼

大家可能要問,為什么要遵循CLS呢?答案在后面給出。
2. CIL,元數據和程序集清單
CIL:公共中間語言。我們大家都知道,在.Net中使用VB寫一個DLL,那么在C#的項目中也可以調用,反之亦然。如何實現的呢?就是CIL了,前面我們說過CLS的作用,并且留下了為什么要遵守CLS的疑問,就是因為.net編譯生成的dll或Exe,其實主要是CIL,原數據和程序集清單這三部分組成。那么要想VB和C#共享,就要有一個通用的規范,它就是CLS了,呵呵,現在明白為什么要CLS了吧,如果你不去遵守CLS也是可以的,但是就不能保證你的dll的復用性了。
元數據:.net的反射,遠程處理,序列化這些東西都很神秘吧,其實他們都是原數據的功勞,你所定義的類,方法,方法的返回類型和參數,屬性,字段,都會被編譯成元數據,然后當你序列化或反射時,拿這些原數據給你生成一個類。
程序集清單:這個就容易理解了,你添加的dll引用的信息全都在這里。下面是一個Dll中的信息。
原代碼:


























使用.Net自帶的 ILDisassembler.exe察看的IL:















就是這三樣東西組成的dll,讓.net實現了遠程處理的remoting,反射,序列化和跨平臺,跨語言。關于跨平臺的問題,我們在下一篇討論。
上一篇我們講解了CIL,CTS,程序集等內容,并且留下了一個問題,就是.net如何跨平臺,我們現在就來弄明白這個問題.由于篇幅有限,請大家參照第一篇的圖.
按照流程圖我們該講解mscoree.dll了
由相關的.net進程來加載Mscoree.dll,對于相關進程我們在后面講到Winform,ASP.NET時,將繼續講解.
mscoree.dll:公共對象運行庫執行引擎.由他來尋找所有要加載的dll的位置并且加載他們(必須包含mscorlib.dll 他是核心類庫,包含大量的核心類型,System,system.io等).然后讀取程序集中的元數據.所以mscoree.dll又被稱為CLR的墊片.
CLR:公共語言運行庫.前面我們已經啟動了他的墊片,那么下來就要.net的靈魂人物出場了,他就是CLR,如同Java的虛擬機一樣,.net缺少了他,就成了殘廢了,呵呵.在mscoree.dll加載了類型以后,CLR會以特定的機器CPU來加載對應的dll(mscorwk.dll或者mscorsrv.dll,這就是.net的性能為何很好的原因),然后CLR會在內存中為類型布局,將關聯的CIL,運用JIT編譯成特定平臺的指令.嘿嘿,也許大家已經猜到了.net是如何跨平臺的了吧.因為.net的dll實際是在運行時,才全部由各平臺的JIT來編譯成機器指令的.所以自然就可以跨平臺嘍.
CLR中的GC:垃圾回收器. 我們知道.net中一般情況是不需要手動釋放資源的,做過C++的人都知道手動釋放資源意味著什么:莫名其妙的錯誤,無盡的深淵....,在.net中所有的托管資源都有GC這個保潔員來給你打掃衛生.CLR中會創建"對象圖"和標示對象的"代".
1.對象圖說白了就是檢查對象是否還可以在被引用.
2.代這個概念是用來幫助GC快速的來檢查哪些對象沒有被引用,在.net中有0,1,2三代.0是新創建的對象,1是執行了一次回收以后,存在引用的對象,2是執行了一次以上回收,還沒有被清理的對象.GC總是從0代開始回收,如果內存已經夠用,則不對1代操作,否則就檢查一代是否存在沒有引用的對象.執行回收,如果還不夠,就清理2代.
我們來看看GC是如何工作的:
ABCDF被標示為0代
我們現在回收0代的對象,因為BF沒有引用,所以回收他們的內存,并且壓縮托管堆.
現在 ACD被標示為1代
如果再來一次回收如果ACD依然沒有被回收,那么他們就被標示為2代.OK,現在我們明白了GC是如何來釋放資源的了.
.net進程: 一個.net進程中包含多個應用程序域,這就是.net平臺操作系統獨立性的關鍵特性,和完整的進程相比,應用程序域的CPU和內存都占用得比較少,因此CLR加載和卸載應用程序域(Appdomain)就快很多.
應用程序域(Appdomain):其中包含多個需要的Dll和上下文(Context),也就是說每個Appdomain都有mscorlib.dll等dll,經過了這一步,就該是具體的應用程序了,如ASP.Net,WPF等不同形式的應用程序,再后續的文章里,將介紹他們的框架,最后再整合起來,就是完整的.net框架了,在這之前,我們先來學習一下.net中重要的幾個Dll,給新 人打一下基礎,高手們就不用看了,不過希望高手們可以指教一下。
下幾篇中介紹.net中常用的Dll,然后再對各種應用程序做圖解。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
