1. 程式人生 > >一:.NET的體系結構

一:.NET的體系結構

C#和.NET關係

C#語言不能孤立使用,必須和.NET Framework一起。C#編譯器基於.NE。也就是說C#所有程式碼總是使用.NET Framework執行

C#是一門專門為.NET Framework使用而設計的。

C#是一種基於現代面向物件設計的語言。

公共語言執行庫

.NET的核心是執行庫執行環境。稱為公共語言執行庫(CLR)或.NET執行庫。在CLR下執行的程式碼稱為託管程式碼

C#編譯有兩個階段

1:將原始碼變為為微軟的中間語言IL

2:CLR將IL編譯為平臺專用的程式碼

IL的優點

  • 平臺無關性(到.NET 4.5.1為止還僅僅停留在理論範疇,也就是僅僅用於Windows平臺)。包含的位元組碼指令可以放在任意平臺中。
  • 提高效能:IL比Java的位元組碼作用還要大,IL總是即時編譯的。即不是一次編譯整個應用程式,而是隻編譯呼叫的部分。程式碼編譯後得到本地可執行程式就儲存起來。只到退出程式。下次執行這部分程式碼就不需要重新編譯了。
  • 語言互操作性:可以將其他語言也編譯成IL(VB,VC,VF#,COM和COM+,windows執行庫)

中間語言IL的主要特徵

  • 面向物件和介面支援
  • 不同的值型別和引用型別
  • 強資料型別化:所有的資料必須有型別。

公共語言規範(CLS)

公共語言規範(Common Language Specification)和通用型別系統一起確保語言的互操作性。

CLS是一種最低標準集,所有面向.NET的編譯器都必須支援。

C#中非CLS相容特性非常少。

垃圾回收

垃圾回收是.NET進行記憶體管理。

Windows平臺有兩種技術釋放記憶體。一是完全手工。如C++。優點是高效,缺點是容易出錯。二是讓物件維護引用計數。即每個元件儲存計數器,當客戶端引用為0時刪除自己。但是問題是可能客戶端沒有這麼做,這樣問題更嚴重。

.NET執行庫的方法時垃圾回收器。方法是所有動態請求的記憶體都分配到堆上。.NET定期檢測堆是否記憶體已滿,如果已滿就呼叫垃圾回收器進行清理。如果有些物件沒有引用,就刪除。

程式集(Assembly)

程式集是包含編譯好的,面向.NET Framework的程式碼邏輯單元。

程式集是自描述的。它是一個邏輯單元二不是物理單元,可以儲存在多個檔案中。如果是多個檔案,就會有一個包含入口的主檔案。

程式集的一個重要特徵是它包含了元資料,描述了程式碼中定義的型別和方法。元資料包含在稱為"清單(manifest)的區域中。程式集入口檔案儲存了不同檔案的細節,如果有檔案被篡改或替換,系統可以檢測出來拒絕載入程式集。

程式集有兩種型別:私有程式集和共享程式集

私有程式集

是最簡單的程式集型別。一般附在某個軟體上。且只能用於該軟體。常見的情況是,以可執行檔案或庫的方式提供應用程式。這些庫的程式碼只能用於該程式。

系統可以保證私有程式集不被其他軟體使用。因為應用程式只能載入位於主執行檔案所在資料夾或子資料夾的私有程式集。

私有程式集部署很簡單,只需要複製檔案即可。

共享程式集

是其他應用程式可以使用的公共庫。需要採取措施防止風險:重名風險,不同版本覆蓋的風險。

方法是把共享程式集放在檔案系統中一個特定的子目錄中,稱為全域性程式集快取(GAC)。與私有程式集不同。不能簡單的檔案複製。而需要專門安裝到快取中。有許多工具可以完成。

為了避免名稱衝突,根據私鑰加密演算法為共享程式集指定了一個名稱,該名稱是強名(strong name)。並保證唯一性,它必須要由引用共享程式集的應用程式來引用。

反射

因為程式集儲存了元資料。包括在程式集中定義了所有型別和成員的細節。所以可以通過程式設計訪問這些元資料。這個技術成為反射。

反射非常有用,託管程式碼可以檢查其他託管程式碼,甚至自己。可以作為例項化類或呼叫方法的一種間接方式。

並行程式設計

針對多處理器的程式設計。有新的可用API和類庫。不過要注意死鎖。

非同步程式設計

C#5.0以Task Parallel Library中的Task為基礎,提供了新的非同步程式設計。新的非同步方法很簡單,只需要兩個關鍵字async和await即可。

.NET Framework類

.NET基類是一個內容豐富的託管程式碼類集合。可以完成以前要通過Windows API來完成的大部分任務。

.NET基類的主要優點是直觀易用。如啟動一個執行緒可以呼叫Thread.Start()方法。除了極少數的情況.NET基類不需要呼叫Windows API函式。

.NET基類主要內容如下

  • IL核心功能:基礎資料型別等
  • Windows UI支援和空間
  • ASP.NET使用Web視窗和MVC
  • ADO.NET和XML資料訪問
  • 檔案系統和登錄檔訪問
  • 網路和Web瀏覽
  • .NET特性和反射
  • COM互操作

名稱空間

名稱空間是.NET避免類名衝突的一種方式。

名稱空間僅僅是資料型別的一種組合方式。但是名稱空間中所有資料型別的名稱都會自動加上名稱空間作為字首。

建議專案的名稱空間以 公司名+專案名的方式命名。

C#建立的.NET應用程式

ASP.NET Web窗體程式

ASP.NET MVC

Web伺服器程式

WPF(兩種桌面程式之一,一種是Windows窗體,還有一種是Windows Presentation Foundation)

Windows Stroe應用程式

Windows 服務(NT服務):基於Windows NT核心的作業系統上後臺執行的程式。C#編寫服務非常簡單,System.ServiceProcess名稱空間的類可以處理。

WCF:ASP.NET Web API可以實現客戶端和伺服器之間的通訊。使用非常簡單,不過沒有SOAP協議豐富。

Windows WF(Windows Workflow Foundation)