国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

.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的情形與此類似。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 津市市| 长宁县| 贡山| 新巴尔虎左旗| 卫辉市| 醴陵市| 蕉岭县| 中山市| 南靖县| 宁海县| 乌苏市| 榆林市| 大丰市| 荔浦县| 镇赉县| 宾阳县| 溆浦县| 罗甸县| 贡嘎县| 东乡| 鄂尔多斯市| 谢通门县| 武邑县| 盐山县| 榆林市| 包头市| 呼图壁县| 晋江市| 高淳县| 安西县| 内乡县| 丰台区| 常德市| 天柱县| 宿州市| 成都市| 卢龙县| 怀来县| 淮北市| 浦北县| 兴城市|