程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> Wrox的C#高級編程第三版第一部分第一章

Wrox的C#高級編程第三版第一部分第一章

編輯:.NET實例教程
1.4.1 私有程序集

私有程序集是使程序集中最簡單的類型。他們一班附帶於軟件上面並且也僅僅被該軟件所用。一般情況下附帶私有程序集的情況是這樣的,你在編寫一個由一個可執行文件和好幾個類庫組成的應用程序,而類庫中的代碼你只想讓這個應用程序使用。

系統保證私有程序集不會被其他的軟件所使用,因為應用程序只可以加載與主可執行文件在同一目錄或者其子目錄的私有程序集。

由於我們一般認為商業軟件總是會被安裝屬於他自己的一個目錄裡,這就是說沒有軟件包被以外覆蓋,修改或者應用程序以外加載其他軟件包的程序集的可能。因此,程序集只能夠被自己所對應的軟件包使用,所以對於什麼軟件使用他們你就有更多的控制權利。因此,不需要采取安全防范措施,根本就不會出現如其他的商用軟件用一些新版本覆蓋你的程序集的可能(專門設計用來執行惡意破壞的軟件除外)。當然,名稱也沒有任何沖突。如果你的私有程序集的類和其他的人的私有程序集的類有相同的名稱也不要緊,因為任何一個應用程序都只能夠使用自己的私有程序集。

因為一個私有程序集是完全自包含的,所以配置他們的過程是非常簡單的。在部署是你只需要簡單的將應用程序文件目錄系統的特定目錄中就可以了(不需要注冊注冊表項)。這個過程被稱為“零影響安裝“(或者xcopy安裝,或者是我們說的綠色安裝)。

1.4.2 共享程序集

共享程序集被規定為任何應用程序都可以使用的公共庫。因為任何軟件都可以訪問共享程序集。需要采取一些防護措施來避免如下的風險:

? 名稱沖突,其他的公司的共享程序集執行類型和你自己的共享程序集有相同的名稱。由於客戶機代碼在理論上存在同時訪問兩個程序集的可能,所以這是一個嚴重的問題。

? 存在一個程序基本不同版本的同一個程序集重寫的可能,並且新版本可能與某些已經存在的客戶機代碼不兼容。

解決這些問題的辦法是將共享程序集放置在文件系統中一個特定的目錄子樹中,被稱作global assembly cache (GAC)。和私有程序集不同,不可以簡單的將共享程序集復制到應用程序的目錄中,它需要被專門的安裝到緩沖區中。這個過程可以利用許多.Net工具來完成,包括對程序集進行特定的檢查,也包括在程序集緩沖區中建立一個小的目錄層次結構來確保程序集的完整性。

為了消除名稱沖突的可能性,共享程序集都不賦予了一個基於私有密匙加密法加密的名稱(私有程序集只需要簡單的指定其主文件的名稱為其名稱就可以了)。這個名稱被稱作“強名“,保證唯一,並且每個引用共享程序集的應用程序都必須提供此名稱。

程序集可能被覆蓋的問題通過允許同時安裝兩個不同版本的相同程序集的時候,在程序集清單中記錄特定的版本信息來解決的,

1.4.3 反射

因為程序集中存儲了元數據,包括所有的類型和這些類型的成員的所有細節都在程序集定義了,所以就可以用程序訪問元數據。這其中的所有細節我們將在第10章討論。這就是可能令人感興趣的被稱作反射的技術,它說明托管代碼可以檢測其他的托管代碼甚至是檢測自身,已確定代碼的信息。反射經常被用於獲得屬性的詳細信息,當然,你也可以將反射技術用於其它目的,例如通過以字符串的方式提供類或者方法的名字來間接實現類或者調用方法。通過這種方法你可以在運行時根據用戶輸入才決定需要實例化的類或者需要調用的方法,而不需在程序編譯之前就決定。

1.5 .Net Framework類庫

至少從一個開發者的觀點來看,編寫托管代碼的一個最大好處就是你可以使用.Net基礎類庫(base class library)。

.NET基礎類就是一大堆已經編寫好了的托管代碼類的集合,幾乎所有以前可以用Windows API來完成的工作她都可以幫你完成。這些類同樣也遵守IL所采用的對象模型,基於單繼承的對象模型。這就是說你既可以實例化任何一個需要的.Net基礎類,或者你可以從其中派生你自己的類。

.Net基礎類庫的一個巨大的優點就是使用起來非常方便。例如,如果要啟動一個線程,你可以直接調用Thread類的Start()方法。如果要銷毀一個TextBox,你需要設計TextBox對象的Enabled屬性為false。雖然Visual Basic 和 Java的開發者很熟悉這種使用方便的類庫,但是對於C++開發者來說這已經帶來了極大的解脫,畢竟多年來他們一直在使用像GetDIBits( ), RegisterWndClassEx( ), 和 IsEqualIID( )這樣的API函數,而且在其間需要傳遞很多的Windows handles。

另一方面,C++開發者總是可以方便的訪問整個Windows API,而Visual Basic 6 和 Java開發者通過各自的語言訪問操作系統的基礎功能就會受到很多限制。.NET基礎類庫的創新就在於它將類似Visual Basic 和 Java類庫使用的便利性和覆蓋整個Windows API功能的全面性結合起來。當然,仍然有一些Windows的特性我們無法通過使用基礎類庫得到,必須使用API功能才能實現,但是,一般來說,那些使用不到的都是些特殊的特性。對於每天的應用而言,基礎類庫已經是足夠的了。如果你確實需要調用API功能的話,不管你是在使用C#, C++, 或者 Visual Basic .NET,.Net也提供了所謂“platform- invoke“,以確保數據類型被正確的轉換,這樣這種調用的工作也沒有在C++中直接調用函數困難。

注意:WinCV,一個基於Windows實用程序,可以用來游覽基礎類庫中的類,結構,接口和枚舉類型。我們將要在第12章討論WinCV。

盡管從題目上看第三章是用來介紹基礎類庫這個主題的,但是實際上,當我們完成了C#語言的語法學習後,這本書的主要任務就是教給你如何使用.NET基礎類庫中的各種各樣的類了。這是一個非常廣泛的基礎類庫!作為一個大致的介紹,.Net的基礎類庫包括:

? IL提供的核心特性(包括,基本數據類型和CTS,具體見第3章)

? Windows GUI的支持和控制(見第19章)

? Web Forms (ASP.Net, 在第25 至 27章討論)

? 數據訪問(ADO.Net, 見第 21 和 22章)

? 目錄訪問(見第24章)

? 文件系統和注冊表訪問(見第30章)

? 網絡和Web游覽(見第31章)

? .Net屬性和反射(見第10章)

? 訪問Windows操作系統(環境變量等,見第14章)

? COM互操作性(見第28和29章)

附帶說明,根據微軟的源文件,.Net基礎類庫中的大多數代碼實際上都是用C#編寫的!

1.5.1 命名空間

命名空間是.Net消除類和類之間名稱沖突的辦法。他是用來避免如下狀況的:你定義一個表示消費者的類,並且給她取名叫做Customer,而正好有另一個人也是這樣做的,這樣就引起了沖突(想象一下,在一個有很多消費者的商業中)。

命名空間只是一組數據類型,但是命名空間裡的數據類型會自動在自己的名字前加上命名空間的名字作為前綴。而且命名空間是可以互相嵌套的。比如,大多數用於一般目的的.Net基礎類都被放在一個稱為System的命名空間裡。基礎類Array就在這個命名空間裡,所以數組的全名是System.Array。

.Net要求所有的數據類型都要定義在命名空間裡,例如你可以將你的Customer類放在一個叫YourCompanyName的命名空間裡。這樣這個類的全名就是“YourCompanyName.Customer“。

注意:如果沒有明確地提供命名空間,那麼定義的類型就會被添加到一個沒有名字的全局命名空間裡。

微軟建議,對於大多情況,你應該指定一個至少兩層嵌套結構的命名空間名稱:第一個代指你的公司名稱,第二個用來指代類所存在於的技術或者軟件包的名稱,例如YourCompanyName.SalesServices.Customer。這樣就保證了在大多數情況下你的應用程序的類都不會和其他的組織的類發生名稱沖突。

我們將要在第2章更加詳細地了解命名空間。

1.6 用C#創建.Net應用程序

C#當然可以用來創建控制台應用程序,一種在DOS窗口下運行的僅有文本的應用程序。你可能會在單元測試類庫時用到控制台應用程序,或者在創建Unix 或者 Linux daemon進程時用到。但是,在更多的情況下你將會用C#創建一些利用更多的.Net技術的應用程序。在這一節,我們將要大體了解一下C#究竟可以創建哪些不同類型的應用程序。

1.6.1 創建ASP.Net應用程序

Active Server Pages (ASP)是微軟用來創建帶有動態內容的Web的技術。一個ASP頁面基本上就是一個在Html中加入大塊運行在服務器端的VBScript 或者 JavaScript代碼的文件。當一個客戶端游覽器請求一個ASP頁面時,Web服務器處理服務器端代碼並連同Html部分一起發送給客戶端。通常,這些腳本會從數據庫裡查詢數據並且用Html將這些數據標記出來。對於客戶來說,ASP是一種創建基於游覽器的應用程序的簡便方法。

但是,ASP也不是沒有缺點。首先,ASP頁面顯示起來比較慢,因為服務器端代碼是解釋運行的,而不是編譯運行。第二,ASP文件很難被維護,因為他們是無結構的,服務器端ASP代碼和普通Html代碼完全混合在一起。第三,有時候開發ASP也是困難的,因為ASP對錯誤處理和類型檢查支持很少。


特別的,如果你希望在你的頁面中用VBScript實現錯誤處理,你就必須使用On Error Resume Next聲明,並且跟蹤檢查Err.Number以確定每個組件的調用有運行正常。

ASP.NET是一個全新版本的ASP,並且修正了的許多問題。ASP.NET並不是為了取代ASP,相反,ASP.NET頁面可以和原來的ASP應用程序一起存在於同一個服務器上。當然,你可以用C#編寫ASP.Net應用程序。

後面的小節我們將會探索一下ASP.Net的關鍵特性。如果想要獲得更多的細節,請參考第25到27章。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved