.NET Framework是微軟為開發應用程序而創建的一個開發平台;其不僅可以運行在Windows操作系統上,而且還可以借助Mono(它是.NET Framework的開源版本,包含C#編譯器)運行在操作Linux和MacOS上;使用.NET Framework的一個重要原因在於它可以集成各種操作系統的方式;.NET Framework還可以創建不同的應用程序的類型,例如:Windows應用程序、Web應用程序、Web服務和其他各種類型的應用程序。
.NET Framework主要包含一個大的代碼庫 ,這個庫分為多個不同的模塊,可以根據想得到的結果來使用其中的各個部分,例如,一個模塊包含Windows用於模塊的構件,一個模塊包含網絡編程的代碼塊,一個模塊包含Web開發的代碼塊等等;其目的是不同的操作系統根據自己的特性,支持其中的部分或者全部模塊。
部分.NET Framework庫還定義了一些基本類型,類型是數據的一種表達方式,指定其中最基礎的部分(如32位帶符號的整數),以便使用.NET Framework在各種語言之間進行交互操作,這稱為通用類型系統(Common Type System,CTS),除這個庫之外,.NET Framework還包含了.NET公共語言運行庫(Common Language Runtime,CLR),他負責管理用.NET庫開發的所有應用程序的執行。
使用.NET Framework編寫應用程序,就是使用.NET代碼庫編寫代碼(使用支持Framework的任何一種語言)。
例如,為了執行C#代碼,必須把它們轉換為目標操作系統能夠理解的語言,即本機代碼(native code),這個轉換稱為編譯代碼,由編譯器執行。但在.NET Framework下,此過程包括兩個階段。
3.1 、CIL和JIT
在編譯使用.NET Framework庫代碼時,不是立即創建專用於操作系統本機代碼,而是把代碼編譯為通用中間語言(Common Intermediate Language,CIL)代碼,這些代碼並非專門用於一種操作系統,也並非專門用於C#。其他.NET語言,如VB .NET也可以再第一階段編譯為這種語言,開發C#應用程序時,這個編譯步驟是由VS完成。
顯然,要執行應用程序,必須完成更多的工作,這是Just-In-Time(JIT)編譯器的任務,它把CIL編譯為專用於操作系統和目標器結構的本機代碼,這樣操作系統才能執行應用程序,這裡編譯器的名稱Just-In-Time反映了CIL代碼僅在需要時才編譯的事實。(JIT編譯器使用CIL代碼,而CIL代碼是獨立於計算機、操作系統和CPU的,目前有幾種JIT編譯器,每種編譯器都用於不同的結構,因此總能找到一個合適的編譯器創建所需的本機代碼【Microsoft Intermediate Language(MSIL)或IL,MSIL是CIL原來的名稱 】)。
3.2 、程序集
在編譯應用程序時,所創建的CIL代碼存儲在一個程序集中,程序集包括可執行的應用程序文件(其擴展名是.exe)和其他應用程序使用的庫(其擴展名是.dll),除了包含的CIL外,程序集還包含元信息(即程序集中包含的數據的信息,也稱元數據)和可選的資源(CIL使用的其他數據,例如聲音文件和圖片),元信息允許程序集是完全自描述的,不需要其他信息就可以使用程序集,即不會遇到不能把需要的數據添加到系統注冊表中的這種情況。
3.3、托管代碼
在將代碼編譯為CIL,再用JIT編譯器將它編譯為本機代碼後,CLR的任務還沒有全部完成,還需要管理正在執行的用.NET Framework編寫的代碼(這個執行代碼的階段通常稱為運行時(runtime)),即CLR管理著應用程序,是方式是管理內存、處理安全性以及允許進行跨語言調試等。相反,不受CLR控制運行的應用程序屬於非托管類型,如C++,但在C#中,只能編寫在托管環境下運行的代碼,使用CLR的托管功能,讓.NET自己與操作系統進行交互。
3.4、垃圾回收
托管代碼最重要的一個功能就是垃圾回收(garbage collection),這種.NET方法可確保應用程序不再使用某些內存時,就會完全釋放這些內存(在.NET推出之前,這項工作主要是由程序員負責,代碼中的幾個簡單錯誤會把大塊內存分配到錯誤的地方,使這些內存神秘失蹤,這就意味著計算機的速度逐漸減慢,最終導致系統崩潰);.NET垃圾回收會定期檢查計算機內存,從中刪除不再需要的內容,它不設置時間幀,可能一秒鐘內會進行上千次的檢查,也可能幾秒鐘才檢查一次,或者隨時檢查,但一定會進行檢查。
提示:因為在不可預知的時間執行這項工作,所以在設計應用程序時,必須留意這一點,需要許多內存才能運行的代碼應自覺執行這樣的檢查,而不是坐等垃圾回收
3.5、總結創建.NET應用程序步驟:
(1)、使用某種.NET兼容語言(如C#)編寫應用程序代碼;
(2)、把代碼編譯為CIL,存儲在程序集中;
(3)、在執行代碼時(如果這是一個可執行文件,就自動運行,或者在其他代碼使用它時運行),首先必須使用JIT編譯器將代碼編譯為本機代碼;
(4)在托管的CLR環境下運行本機代碼,以及其他應用程序或進程;