.net框架程序設(shè)計(jì)讀書筆記二(Microsoft .net 框架開發(fā)平臺(tái)體系架構(gòu))
2024-07-10 12:59:27
供稿:網(wǎng)友
 
,歡迎訪問網(wǎng)頁設(shè)計(jì)愛好者web開發(fā)。第一章:microsoft .net 框架開發(fā)平臺(tái)體系架構(gòu)
 
 本章的目標(biāo):對(duì).net框架體系架構(gòu)有一個(gè)總體的認(rèn)識(shí),并對(duì).net框架中出現(xiàn)的一些新的技術(shù)和術(shù)語有一個(gè)基本的了解。
 
1.1 將源代碼編譯為托管模塊
 關(guān)于編程語言的選擇
 .net框架的核心是通用語言運(yùn)行時(shí),顧名思義它是一個(gè)可被各種不同的編程語言所使用的運(yùn)行時(shí)。clr的很多特性可用于所有面向它的編程語言,如果clr用異常來報(bào)告錯(cuò)誤,那么所有面向它的語言都將通過異常來得到錯(cuò)誤報(bào)告。如果clr允許我們創(chuàng)建線程,那么所有面向它的語言也都可以創(chuàng)建線程。
實(shí)際上clr在運(yùn)行時(shí)對(duì)開發(fā)人員用何種編程語言來完成源代碼一無所知。這意味著我們應(yīng)該選擇那些能夠最容易表達(dá)我們意圖的編程語言。我們可以用任何自己喜歡的語言(面向clr的)來編寫代碼。
不同的編程語言允許我們使用不同的語法進(jìn)行開發(fā),不同的語法對(duì)于我們解決各種問題的難易程度是有影響的,例如:對(duì)于數(shù)學(xué)或者金融應(yīng)用,彩用apl語法更快。
 
微軟已經(jīng)創(chuàng)建了以下幾種面向clr的編譯器 :
 托管擴(kuò)展c++ 
 c#
 visual basic
 jscript
 j#
 il匯編器
 
 我們可以用任何支持clr的編程語言來創(chuàng)建源代碼文件。然后用相應(yīng)的編譯器來做語法檢查和源代碼分析。最后生成托管橡塊。
 
托管模塊
 
 托管模塊是一個(gè)需要clr才能執(zhí)行的標(biāo)準(zhǔn)windows可移植可執(zhí)行(portable executable,簡(jiǎn)稱pe)文件。
 
托管模塊的組成部分:
l pe表頭
標(biāo)準(zhǔn)windows pe文件表頭,類似于通用對(duì)像文件格式表頭。該表頭指出了文件的類型:gui(圖形用戶界面),cui(控制臺(tái)用戶界面),或者dll. 此處的dll并非我們理解的傳統(tǒng)的windows 動(dòng)態(tài)鏈接庫文件,雖然都叫dll,但,net平臺(tái)中的dll指程序集文件的一種形式),該表頭還包含文件創(chuàng)建時(shí)間。對(duì)于包含cpu代碼的模塊,該表頭還會(huì)包含有關(guān)本地cpu代碼的一些信息
 
l clr表頭
 包含標(biāo)識(shí)托管模塊的一些信息(可以被clr或者一些實(shí)用工具解析)。
1、 clr版本號(hào)
2、 托管模塊入口點(diǎn)方法(main方法)的元數(shù)據(jù)標(biāo)記
3、 托管模塊的元數(shù)據(jù)標(biāo)記
4、 資源
5、 強(qiáng)命名
6、 其他一些意義不是太大的信息的位置和尺寸
 
l 元數(shù)據(jù)
每個(gè)托管模塊都包含有一些元數(shù)據(jù)表。元數(shù)據(jù)表主要分兩種,一種用于描述源代碼中定義的類型和成員,一種用于描述源代碼中的引用類型和成員。
 
l 中間語言(il)和代碼
 編譯器在編譯源代碼是產(chǎn)生的指令。clr在運(yùn)行時(shí)會(huì)將il代碼編譯成本地cpu指令
 
元數(shù)據(jù)(metadata)就是一個(gè)數(shù)據(jù)表的集合,在這些表中,其中一些用于描述托管模塊中所定義的內(nèi)容(比如所定義的類型和它們的成員,另外一些用于描述托管模塊中引用的內(nèi)容(比如被引用的類型和它們的成員)。元數(shù)據(jù)總是和包含il代碼的的文件相關(guān)聯(lián)。
 
元數(shù)據(jù)的用處:
1、 省去了源代碼編譯時(shí)對(duì)頭文件和庫文件的需求,
2、 visual studio .net可以利用元數(shù)據(jù)來輔助我們編寫代碼。智能感知就是這樣做的。
3、 可以序列化和反序列化
4、 垃圾收集器可以追蹤對(duì)像的生存期。
 
 
1.2 將托管模塊組合為程序集
clr實(shí)際上并不和托管模塊打交道,它直接打交道的對(duì)象是程序集(assembly).程序集是一個(gè)抽象的概念,剛開始往往很難理解。首先,程序集是一個(gè)或多個(gè)托管模塊,以及一些資源文件的邏輯組合。其次,程序集是組件復(fù)用,以及實(shí)施安全策略和版本的最小單位。根據(jù)我們對(duì)編譯器和相關(guān)工具所做的選擇,程序集可以是一個(gè)文件或者多個(gè)文件。
默認(rèn)情況下,編譯器會(huì)將產(chǎn)生的托管模塊轉(zhuǎn)換為一個(gè)程序集。也就是說,c#編譯器產(chǎn)生的是一個(gè)我包含了清單的托管模。其中的清單表明程序集中僅包含一個(gè)文件。對(duì)于僅包含一個(gè)托管模塊,并且沒有資源(或者數(shù)據(jù))文件的項(xiàng)目來說,程序集就是托管模塊,而且在創(chuàng)建過程中,不需要執(zhí)行任何其他的步驟。
程序集中的模塊還包含它所引用的程序集的一些信息(如版本號(hào)信息)。這些信息使得一個(gè)程序集得以實(shí)現(xiàn)自描述(self-describing)。換句話說,clr知道執(zhí)行一個(gè)程序集所需要的所有內(nèi)容,它不需要再在注冊(cè)表或者活動(dòng)目錄中獲取額外的信息。因此,程序集的部署要比非托管組件的部署容易得多。
1.3加載通用語言運(yùn)行時(shí)
一個(gè)程序集或者是一個(gè)可執(zhí)行應(yīng)用程序,或者是一個(gè)包含供可執(zhí)行應(yīng)用程序使用的一組類型(組件)的dll。clr負(fù)責(zé)管理包含在程序集中的代碼的執(zhí)行。這意味著宿主機(jī)器必須安裝.net框架。微軟已經(jīng)創(chuàng)建了一個(gè)可以將.net框架免費(fèi)安裝到客戶機(jī)上的分發(fā)包。.net框架最終會(huì)和將來的windows打包在一起,這樣我們就不需要將它和我們的程序集放在一起來發(fā)布了。
我們可以通過在%windir%/system32目錄下查找mscoree.dll文件來判斷一個(gè)機(jī)器中是否安裝了.net框架。如果想確定一個(gè)機(jī)器中安裝了哪些版本的.net框架,可以查看下面的注冊(cè)表鍵的子鍵:
hkey_local_machine / software / microsoft / .netframework / policy
 
當(dāng)生成一個(gè)exe程序集時(shí),編譯器/鏈接器會(huì)產(chǎn)生一些特殊的信息,并將它們嵌入到結(jié)果程序集的pe文件表頭及其各個(gè)組成文件的.text部分。當(dāng)exe文件被調(diào)用時(shí),這些特殊的信息將導(dǎo)致clr被加載并初始化。clr隨后會(huì)定位至應(yīng)勝程序的入口點(diǎn)方法,從面以此來啟動(dòng)應(yīng)用程序。
 
類似地,如果是一個(gè)非托管應(yīng)用程序通過調(diào)用loadlibrary來加載一個(gè)托管程序集,那么該托管程序集dll的入口點(diǎn)函數(shù)也會(huì)知道去加載clr來處理包含在其中的代碼。
 
托管exe加載并初始化clr的過程
1. mscoree檢查clr表頭以獲得main方法的元數(shù)據(jù)標(biāo)記。
2. mscoree 檢查main方法的元數(shù)據(jù)以獲得其il在托管exe中的位置。
3. mscoree 將main方法的il編譯成本地cpu指令。
4. mscoree跳轉(zhuǎn)到main方法編譯后的本地cpu指令上(使用主線程)
5. 應(yīng)用程序開始運(yùn)行。
 
 托管dll的情形與此類似。