Wrox的C#高級編程第三版第一部分第一章
2024-07-21 02:18:30
供稿:網(wǎng)友
1.4.1 私有程序集
私有程序集是使程序集中最簡單的類型。他們一班附帶于軟件上面并且也僅僅被該軟件所用。一般情況下附帶私有程序集的情況是這樣的,你在編寫一個由一個可執(zhí)行文件和好幾個類庫組成的應(yīng)用程序,而類庫中的代碼你只想讓這個應(yīng)用程序使用。
系統(tǒng)保證私有程序集不會被其他的軟件所使用,因?yàn)閼?yīng)用程序只可以加載與主可執(zhí)行文件在同一目錄或者其子目錄的私有程序集。
由于我們一般認(rèn)為商業(yè)軟件總是會被安裝屬于他自己的一個目錄里,這就是說沒有軟件包被以外覆蓋,修改或者應(yīng)用程序以外加載其他軟件包的程序集的可能。因此,程序集只能夠被自己所對應(yīng)的軟件包使用,所以對于什么軟件使用他們你就有更多的控制權(quán)利。因此,不需要采取安全防范措施,根本就不會出現(xiàn)如其他的商用軟件用一些新版本覆蓋你的程序集的可能(專門設(shè)計(jì)用來執(zhí)行惡意破壞的軟件除外)。當(dāng)然,名稱也沒有任何沖突。如果你的私有程序集的類和其他的人的私有程序集的類有相同的名稱也不要緊,因?yàn)槿魏我粋€應(yīng)用程序都只能夠使用自己的私有程序集。
因?yàn)橐粋€私有程序集是完全自包含的,所以配置他們的過程是非常簡單的。在部署是你只需要簡單的將應(yīng)用程序文件目錄系統(tǒng)的特定目錄中就可以了(不需要注冊注冊表項(xiàng))。這個過程被稱為“零影響安裝“(或者xcopy安裝,或者是我們說的綠色安裝)。
1.4.2 共享程序集
共享程序集被規(guī)定為任何應(yīng)用程序都可以使用的公共庫。因?yàn)槿魏诬浖伎梢栽L問共享程序集。需要采取一些防護(hù)措施來避免如下的風(fēng)險(xiǎn):
? 名稱沖突,其他的公司的共享程序集執(zhí)行類型和你自己的共享程序集有相同的名稱。由于客戶機(jī)代碼在理論上存在同時訪問兩個程序集的可能,所以這是一個嚴(yán)重的問題。
? 存在一個程序基本不同版本的同一個程序集重寫的可能,并且新版本可能與某些已經(jīng)存在的客戶機(jī)代碼不兼容。
解決這些問題的辦法是將共享程序集放置在文件系統(tǒng)中一個特定的目錄子樹中,被稱作global assembly cache (gac)。和私有程序集不同,不可以簡單的將共享程序集復(fù)制到應(yīng)用程序的目錄中,它需要被專門的安裝到緩沖區(qū)中。這個過程可以利用許多.net工具來完成,包括對程序集進(jìn)行特定的檢查,也包括在程序集緩沖區(qū)中建立一個小的目錄層次結(jié)構(gòu)來確保程序集的完整性。
為了消除名稱沖突的可能性,共享程序集都不賦予了一個基于私有密匙加密法加密的名稱(私有程序集只需要簡單的指定其主文件的名稱為其名稱就可以了)。這個名稱被稱作“強(qiáng)名“,保證唯一,并且每個引用共享程序集的應(yīng)用程序都必須提供此名稱。
程序集可能被覆蓋的問題通過允許同時安裝兩個不同版本的相同程序集的時候,在程序集清單中記錄特定的版本信息來解決的,
1.4.3 反射
因?yàn)槌绦蚣写鎯α嗽獢?shù)據(jù),包括所有的類型和這些類型的成員的所有細(xì)節(jié)都在程序集定義了,所以就可以用程序訪問元數(shù)據(jù)。這其中的所有細(xì)節(jié)我們將在第10章討論。這就是可能令人感興趣的被稱作反射的技術(shù),它說明托管代碼可以檢測其他的托管代碼甚至是檢測自身,已確定代碼的信息。反射經(jīng)常被用于獲得屬性的詳細(xì)信息,當(dāng)然,你也可以將反射技術(shù)用于其它目的,例如通過以字符串的方式提供類或者方法的名字來間接實(shí)現(xiàn)類或者調(diào)用方法。通過這種方法你可以在運(yùn)行時根據(jù)用戶輸入才決定需要實(shí)例化的類或者需要調(diào)用的方法,而不需在程序編譯之前就決定。
1.5 .net framework類庫
至少從一個開發(fā)者的觀點(diǎn)來看,編寫托管代碼的一個最大好處就是你可以使用.net基礎(chǔ)類庫(base class library)。
.net基礎(chǔ)類就是一大堆已經(jīng)編寫好了的托管代碼類的集合,幾乎所有以前可以用windows api來完成的工作她都可以幫你完成。這些類同樣也遵守il所采用的對象模型,基于單繼承的對象模型。這就是說你既可以實(shí)例化任何一個需要的.net基礎(chǔ)類,或者你可以從其中派生你自己的類。
.net基礎(chǔ)類庫的一個巨大的優(yōu)點(diǎn)就是使用起來非常方便。例如,如果要啟動一個線程,你可以直接調(diào)用thread類的start()方法。如果要銷毀一個textbox,你需要設(shè)計(jì)textbox對象的enabled屬性為false。雖然visual basic 和 java的開發(fā)者很熟悉這種使用方便的類庫,但是對于c++開發(fā)者來說這已經(jīng)帶來了極大的解脫,畢竟多年來他們一直在使用像getdibits( ), registerwndclassex( ), 和 isequaliid( )這樣的api函數(shù),而且在其間需要傳遞很多的windows handles。
另一方面,c++開發(fā)者總是可以方便的訪問整個windows api,而visual basic 6 和 java開發(fā)者通過各自的語言訪問操作系統(tǒng)的基礎(chǔ)功能就會受到很多限制。.net基礎(chǔ)類庫的創(chuàng)新就在于它將類似visual basic 和 java類庫使用的便利性和覆蓋整個windows api功能的全面性結(jié)合起來。當(dāng)然,仍然有一些windows的特性我們無法通過使用基礎(chǔ)類庫得到,必須使用api功能才能實(shí)現(xiàn),但是,一般來說,那些使用不到的都是些特殊的特性。對于每天的應(yīng)用而言,基礎(chǔ)類庫已經(jīng)是足夠的了。如果你確實(shí)需要調(diào)用api功能的話,不管你是在使用c#, c++, 或者 visual basic .net,.net也提供了所謂“platform- invoke“,以確保數(shù)據(jù)類型被正確的轉(zhuǎn)換,這樣這種調(diào)用的工作也沒有在c++中直接調(diào)用函數(shù)困難。
注意:wincv,一個基于windows實(shí)用程序,可以用來游覽基礎(chǔ)類庫中的類,結(jié)構(gòu),接口和枚舉類型。我們將要在第12章討論wincv。
盡管從題目上看第三章是用來介紹基礎(chǔ)類庫這個主題的,但是實(shí)際上,當(dāng)我們完成了c#語言的語法學(xué)習(xí)后,這本書的主要任務(wù)就是教給你如何使用.net基礎(chǔ)類庫中的各種各樣的類了。這是一個非常廣泛的基礎(chǔ)類庫!作為一個大致的介紹,.net的基礎(chǔ)類庫包括:
? il提供的核心特性(包括,基本數(shù)據(jù)類型和cts,具體見第3章)
? windows gui的支持和控制(見第19章)
? web forms (asp.net, 在第25 至 27章討論)
? 數(shù)據(jù)訪問(ado.net, 見第 21 和 22章)
? 目錄訪問(見第24章)
? 文件系統(tǒng)和注冊表訪問(見第30章)
? 網(wǎng)絡(luò)和web游覽(見第31章)
? .net屬性和反射(見第10章)
? 訪問windows操作系統(tǒng)(環(huán)境變量等,見第14章)
? com互操作性(見第28和29章)
附帶說明,根據(jù)微軟的源文件,.net基礎(chǔ)類庫中的大多數(shù)代碼實(shí)際上都是用c#編寫的!
1.5.1 命名空間
命名空間是.net消除類和類之間名稱沖突的辦法。他是用來避免如下狀況的:你定義一個表示消費(fèi)者的類,并且給她取名叫做customer,而正好有另一個人也是這樣做的,這樣就引起了沖突(想象一下,在一個有很多消費(fèi)者的商業(yè)中)。
命名空間只是一組數(shù)據(jù)類型,但是命名空間里的數(shù)據(jù)類型會自動在自己的名字前加上命名空間的名字作為前綴。而且命名空間是可以互相嵌套的。比如,大多數(shù)用于一般目的的.net基礎(chǔ)類都被放在一個稱為system的命名空間里。基礎(chǔ)類array就在這個命名空間里,所以數(shù)組的全名是system.array。
.net要求所有的數(shù)據(jù)類型都要定義在命名空間里,例如你可以將你的customer類放在一個叫yourcompanyname的命名空間里。這樣這個類的全名就是“yourcompanyname.customer“。
注意:如果沒有明確地提供命名空間,那么定義的類型就會被添加到一個沒有名字的全局命名空間里。
微軟建議,對于大多情況,你應(yīng)該指定一個至少兩層嵌套結(jié)構(gòu)的命名空間名稱:第一個代指你的公司名稱,第二個用來指代類所存在于的技術(shù)或者軟件包的名稱,例如yourcompanyname.salesservices.customer。這樣就保證了在大多數(shù)情況下你的應(yīng)用程序的類都不會和其他的組織的類發(fā)生名稱沖突。
我們將要在第2章更加詳細(xì)地了解命名空間。
1.6 用c#創(chuàng)建.net應(yīng)用程序
c#當(dāng)然可以用來創(chuàng)建控制臺應(yīng)用程序,一種在dos窗口下運(yùn)行的僅有文本的應(yīng)用程序。你可能會在單元測試類庫時用到控制臺應(yīng)用程序,或者在創(chuàng)建unix 或者 linux daemon進(jìn)程時用到。但是,在更多的情況下你將會用c#創(chuàng)建一些利用更多的.net技術(shù)的應(yīng)用程序。在這一節(jié),我們將要大體了解一下c#究竟可以創(chuàng)建哪些不同類型的應(yīng)用程序。
1.6.1 創(chuàng)建asp.net應(yīng)用程序
active server pages (asp)是微軟用來創(chuàng)建帶有動態(tài)內(nèi)容的web的技術(shù)。一個asp頁面基本上就是一個在html中加入大塊運(yùn)行在服務(wù)器端的vbscript 或者 javascript代碼的文件。當(dāng)一個客戶端游覽器請求一個asp頁面時,web服務(wù)器處理服務(wù)器端代碼并連同html部分一起發(fā)送給客戶端。通常,這些腳本會從數(shù)據(jù)庫里查詢數(shù)據(jù)并且用html將這些數(shù)據(jù)標(biāo)記出來。對于客戶來說,asp是一種創(chuàng)建基于游覽器的應(yīng)用程序的簡便方法。
但是,asp也不是沒有缺點(diǎn)。首先,asp頁面顯示起來比較慢,因?yàn)榉?wù)器端代碼是解釋運(yùn)行的,而不是編譯運(yùn)行。第二,asp文件很難被維護(hù),因?yàn)樗麄兪菬o結(jié)構(gòu)的,服務(wù)器端asp代碼和普通html代碼完全混合在一起。第三,有時候開發(fā)asp也是困難的,因?yàn)閍sp對錯誤處理和類型檢查支持很少。
特別的,如果你希望在你的頁面中用vbscript實(shí)現(xiàn)錯誤處理,你就必須使用on error resume next聲明,并且跟蹤檢查err.number以確定每個組件的調(diào)用有運(yùn)行正常。
asp.net是一個全新版本的asp,并且修正了的許多問題。asp.net并不是為了取代asp,相反,asp.net頁面可以和原來的asp應(yīng)用程序一起存在于同一個服務(wù)器上。當(dāng)然,你可以用c#編寫asp.net應(yīng)用程序。
后面的小節(jié)我們將會探索一下asp.net的關(guān)鍵特性。如果想要獲得更多的細(xì)節(jié),請參考第25到27章。