官术网_书友最值得收藏!

1.1 .NET Framework的含義

.NET Framework(現在最新版本是4.6)是Microsoft為開發應用程序而創建的一個具有革命意義的平臺。這句話最有趣的地方在于它的廣義性,但這是有原因的。首先,注意這句話沒有說“在Windows操作系統上開發應用程序”。盡管.NET Framework的Microsoft版本運行在Windows操作系統和Windows Phone操作系統上,但它也有運行在其他操作系統上的版本,例如Mono,它是.NET Framework的開源版本(包含C#編譯器),該版本可以運行在幾個操作系統上,包括各種Linux版本和Mac OS,詳見http://www.mono-project.com。另外,Mono還有一些版本可以運行在iPhone(MonoTouch)和Android(Mono for Android,也稱為MonoDroid)智能手機上。使用.NET Framework的一個重要原因是它可以作為集成各種操作系統的方式。

另外,上面給出的.NET Framework定義并未限制應用程序的類型。這是因為本來就沒有限制。可以使用.NET Framework創建桌面應用程序、Windows Store應用程序、云/Web應用程序、Web API和其他各種類型的應用程序。另外注意,對于Web、云和Web API應用程序,按照定義,它們是多平臺的應用程序,因為任何帶有Web瀏覽器的系統都可以訪問它們。

.NET Framework的設計方式確保它可以用于各種語言,包括本書介紹的C#語言,以及C++、Visual Basic、JScript甚至一些舊語言,如COBOL。為此,還推出了這些語言的.NET版本,目前還在不斷推出更多版本。要獲得這些語言的列表,可以訪問https://msdn.microsoft.com/library/aa292164.aspx。所有這些語言都可以訪問.NET Framework,它們彼此之間還可以通信。C#開發人員可以使用Visual Basic程序員編寫的代碼,反之亦然。

所有這些提供了意想不到的多樣性,這也是.NET Framework具有誘人前景的部分原因。

1.1.1 .NET Framework的內容

.NET Framework主要包含一個龐大的代碼庫,可以在客戶語言(如C#)中通過面向對象編程技術(OOP)來使用這些代碼。這個庫分為多個不同的模塊,這樣就可以根據希望得到的結果來選擇使用其中的各個部分。例如,一個模塊包含Windows應用程序的構件,另一個模塊包含網絡編程的代碼塊,還有一個模塊包含Web開發的代碼塊。一些模塊還分為更具體的子模塊,例如,在Web開發模塊中,有用于建立Web服務的子模塊。

其目的是,不同操作系統可以根據各自的特性,支持其中的部分或全部模塊。例如,智能手機支持所有的核心.NET功能,但不需要某些更高級的模塊。

部分.NET Framework庫定義了一些基本類型。類型是數據的一種表達方式,指定最基本類型(如32位帶符號的整數)有助于使用.NET Framework的各種語言之間進行交互操作,這稱為公共類型系統(Common Type System, CTS)。

除提供這個庫外,.NET Framework還包含.NET公共語言運行庫(Common Language Runtime, CLR),它負責管理用.NET庫開發的所有應用程序的執行。

1.1.2 使用.NET Framework編寫應用程序

使用.NET Framework編寫應用程序,就是使用.NET代碼庫編寫代碼(使用支持Framework的任何一種語言)。本書用VS進行開發,VS是一種強大的集成開發環境,支持C#(以及托管和非托管C++、Visual Basic和其他一些語言)。這個環境的優點是便于把.NET功能集成到代碼中。我們創建的代碼完全是C#代碼,但使用了.NET Framework,并在需要時利用了VS中的其他工具。

為執行C#代碼,必須把它們轉換為目標操作系統能理解的語言,即本機代碼(native code)。這種轉換稱為編譯代碼,由編譯器執行。但在.NET Framework下,此過程包括兩個階段。

1. CIL和JIT

在編譯使用.NET Framework庫的代碼時,不是立即創建專用于操作系統的本機代碼,而是把代碼編譯為通用中間語言(Common Intermediate Language, CIL)代碼,這些代碼并非專門用于任何一種操作系統,也非專門用于C#。其他.NET語言(如Visual Basic .NET)也會在第一階段編譯為這種語言。開發C#應用程序時,這個編譯步驟由VS完成。

顯然,要執行應用程序,必須完成更多工作,這是Just-In-Time(JIT)編譯器的任務,它把CIL編譯為專用于OS和目標機器結構的本機代碼。這樣OS才能執行應用程序。這里編譯器的名稱Just-In-Time反映了CIL代碼僅在需要時才編譯的事實。這種編譯可以在應用程序的運行過程中動態發生,不過開發人員一般不需要關心這個過程。除非要編寫性能十分關鍵的代碼,否則知道這個編譯過程會在后臺自動進行,并不需要人工干預就可以了。

過去,常需要把代碼編譯為幾個應用程序,每個應用程序都用于特定的操作系統和CPU結構。這通常是一種優化形式(例如,為了讓代碼在AMD芯片組上運行得更快),有時則是非常重要的(例如,使應用程序可以同時工作在Win9x和WinNT/2000環境下)。現在就沒必要了,因為JIT編譯器使用CIL代碼,而CIL代碼是獨立于計算機、操作系統和CPU的。目前有幾種JIT編譯器,每種編譯器都用于不同的結構,CIL會使用合適的編譯器創建所需的本機代碼。

這樣,開發人員需要做的工作就比較少了。實際上,可以忽略與系統相關的細節,將注意力集中在代碼的功能上就夠了。

提示:讀者可能遇到過Microsoft Intermediate Language(MSIL)或IL, MSIL是CIL原來的名稱,許多開發人員仍沿用這個術語。

2.程序集

編譯應用程序時,所創建的CIL代碼存儲在一個程序集中。程序集包括可執行的應用程序文件(這些文件可以直接在Windows上運行,不需要其他程序,其擴展名是.exe)和其他應用程序使用的庫(其擴展名是.dll)。

除包含CIL外,程序集還包含元信息(即程序集中包含的數據的信息,也稱為元數據)和可選的資源(CIL使用的其他數據,例如,聲音文件和圖片)。元信息允許程序集是完全自描述的。不需要其他信息就可以使用程序集,也就是說,我們不會遇到沒有把需要的數據添加到系統注冊表中這樣的問題,而在使用其他平臺進行開發時這個問題常常出現。

因此,部署應用程序就非常簡單了,只需把文件復制到遠程計算機上的目錄下即可。因為不需要目標系統上的其他信息,所以只需從該目錄中運行可執行文件即可(假定安裝了.NET CLR)。

當然,不必把運行應用程序需要的所有信息都安裝到一個地方。可以編寫一些代碼來執行多個應用程序所要求的任務。此時,通常把這些可重用的代碼放在所有應用程序都可以訪問的地方。在.NET Framework中,這個地方是全局程序集緩存(Global Assembly Cache, GAC),把代碼放在這個緩存中是很簡單的,只需把包含代碼的程序集放在包含該緩存的目錄中即可。

3.托管代碼

在將代碼編譯為CIL,再用JIT編譯器將它編譯為本機代碼后,CLR的任務尚未全部完成,還需要管理正在執行的用.NET Framework編寫的代碼(這個執行代碼的階段通常稱為運行時(runtime))。即CLR管理著應用程序,其方式是管理內存、處理安全性以及允許進行跨語言調試等。相反,不受CLR控制運行的應用程序屬于非托管類型,某些語言(如C++)可以用于編寫此類應用程序,例如,訪問操作系統的底層功能。但是在C#中,只能編寫在托管環境下運行的代碼。我們將使用CLR的托管功能,讓.NET處理與操作系統的任何交互。

4.垃圾回收

托管代碼最重要的一個功能是垃圾回收(garbage collection)。這種.NET方法可確保應用程序不再使用某些內存時,就會完全釋放這些內存。在.NET推出以前,這項工作主要由程序員負責,代碼中的幾個簡單錯誤會把大塊內存分配到錯誤的地方,使這些內存神秘失蹤。這通常意味著計算機的速度逐漸減慢,最終導致系統崩潰。

.NET垃圾回收會定期檢查計算機內存,從中刪除不再需要的內容。執行垃圾回收的時間并不固定,可能一秒鐘內會進行數千次的檢查,也可能幾秒鐘才檢查一次,不過一定會進行檢查。

這里要給程序員一些提示。因為在不可預知的時間執行這項工作,所以在設計應用程序時,必須留意這一點。需要許多內存才能運行的代碼應自行完成清理工作,而不是坐等垃圾回收,但這不像聽起來那樣難。

5.把它們組合在一起

在繼續學習之前,先總結一下上述創建.NET應用程序所需的步驟:

(1)使用某種.NET兼容語言(如C#)編寫應用程序代碼,如圖1-1所示。

圖1-1

(2)把代碼編譯為CIL,存儲在程序集中,如圖1-2所示。

圖1-2

(3)在執行代碼時(如果這是一個可執行文件,就自動運行,或者在其他代碼使用它時運行),首先必須使用JIT編譯器將代碼編譯為本機代碼,如圖1-3所示。

圖1-3

(4)在托管的CLR環境下運行本機代碼,以及其他應用程序或進程,如圖1-4所示。

圖1-4

6.鏈接

在上述過程中還有一點要注意。在第(2)步中編譯為CIL的C#代碼未必包含在單獨文件中,可以把應用程序代碼放在多個源代碼文件中,再把它們編譯到一個程序集中。這個過程稱為鏈接(linking),是非常有用的。原因是處理幾個較小的文件比處理一個大文件要簡單得多。可以把邏輯上相關的代碼分解到一個文件中,以便單獨進行處理,這也更便于在需要時找到特定的代碼塊,讓開發小組把編程工作分解為一些可管理的塊,讓每個人編寫一小塊代碼,而不會破壞已編寫好的代碼部分或其他人正在處理的部分。

主站蜘蛛池模板: 吉木萨尔县| 南丰县| 白山市| 区。| 那曲县| 紫金县| 岑巩县| 宜昌市| 天峨县| 咸宁市| 台州市| 沛县| 和林格尔县| 灯塔市| 平凉市| 黄平县| 阳高县| 京山县| 谢通门县| 绥宁县| 资溪县| 青龙| 双城市| 叶城县| 尚志市| 昌邑市| 内丘县| 怀柔区| 建始县| 曲靖市| 云南省| 平潭县| 尚志市| 贞丰县| 临江市| 当阳市| 大英县| 延安市| 新丰县| 淮北市| 德化县|