以往,每個應用程式程序都有自己的虛擬位址空間,通過位址空間的隔離來保證乙個程序不會干擾另乙個程序的執行。但通過驗證託管**,可以確保不會訪問不該訪問的記憶體,因此可以乙個單獨的虛擬位址空間內執行多個託管應用程式。由於太多的程序會占用過多的系統資源,損傷系統效能,並限制系統可用的資源。因此在乙個程序中執行多個託管應用程式可以減少程序的數量,提高系統效能,降低資源需求,而同時應用程式仍然可以保持良好的健壯性。
.net framework提供了一組豐富的類庫(fcl),其中含有幾千個型別的定義。clr 和fcl使開發者可以建立以下應用程式:(1)xml web服務;(2)web窗體;(3)windows窗體;(4)控制台應用程式;(5)windows服務:windows服務控制管理器(scm)控制的服務程式;(6)元件庫;
clr支援三種互操作:
(1) 託管**呼叫dll中的非託管函式。託管**可以使用一種叫p/invoke(就是平台呼叫)的機制來呼叫dll中的函式。實際上,許多fcl中定義的型別內部都呼叫了從kernel32.dll,user32.dll等dll中匯出的函式。例如,c#程式可以呼叫從kernel32.dll中匯出的createsemaphore函式。
(2) 託管**使用現存的com元件(非託管元件作為com伺服器)。利用現有的com元件的型別庫,我們可以建立出描述它們的託管程式集,託管**可以象訪問其他託管**一樣訪問這些託管程式集中的型別。有時候沒有型別庫,我們可以在**中建立自己的型別,clr可以用這些型別進行正確的互操作,例如,可以在c# 應用程式中使用directx com 元件。
(3) 非託管**使用託管型別(託管型別作為com伺服器)。許多現存的非託管**都需要提供com元件才能正常執行。而用託管**來實現這些元件更容易,因為這樣可以避免處理引用計數和com介面。例如,可以用c#來建立activex控制項或者shell擴充套件程式。
#include
#include
using namespace system;
void main()
在安裝新的應用程式時卻損壞了現有的應用程式,這叫「dll hell」.現在大多數應用程式的安裝都會影響系統的各個部分。例如,會複製許多檔案到許多目錄中,更新登錄檔設定,安裝快捷鍵到桌面,開始選單和快速啟動中。這就是備份應用程式比較困難,因為必須複製所有的檔案和相關的登錄檔內容,而要將應用程式移植到另外一抬機器也很困難,必須 重新安裝。最後,解除安裝應用程式也很麻煩。.net framework使元件不再需要象com那樣在登錄檔中進行註冊。它還包含了乙個叫**訪問安全的安全模型,這是基於程式集的標識來控制的。
乙個託管pe檔案包含4部分:pe表頭,clr表頭,元資料和il**。pe表頭是系統要求的標準資訊。clr表頭專用於那些需要clr 才能執行的模組(託管模組)。clr表頭中包含和模組一起建立的元資料的主版本號和次版本號,一些標記,若模組是cui或gui,可執行檔案還有乙個標識入口點方法的methoddef標記,以及乙個可選的強命名數字簽名。該表頭還包括模組內某些元資料表的大小和偏移量。
元資料實際是一塊二進位制資料,其中包含一些表,可以分為3類:定義表,引用表,清單表。程式集中包含了乙個檔案用於儲存清單(manifest).清單是另外一組元資料的集合,其中主要包含了程式集中一部分檔案的名稱,還描述了程式集的版本,語言文化,發布者,公有匯出型別,以及組成程式集的所有檔案。clr總是先載入包含清單元資料的檔案,然後利用該清單來獲取程式集中的其他檔案。程式集的特性:1)定義了可重用的型別。2)程式集標識有乙個版本號。3)可以包含與之相關的安全資訊。
程式集是乙個可重用,可實施版本策略和安全策略的單元,它允許我們將型別和資源劃分到不同的檔案中,這樣程式集的使用者就可以決定將哪些檔案打包在一起部署,一旦clr載入了程式集中包含清單的那個檔案,就可以確定程式集的其他檔案中包含了程式正在引用的型別和資源,任何程式集的使用者只需要知道包含清單的檔名稱,檔案的劃分對使用者是透明的,並且可以在將來改變,同時又不會破壞現有應用程式的行為。
對於可執行應用程式(exe),配置檔案必須位於應用程式的基目錄中,並且它的名字必須是exe檔名再加.config副檔名。對於asp.net web窗體和xml web服務應用程式,配置檔案必須位於 web應用程式的虛擬根目錄下,並且名稱總是web.config.另外,子目錄也可以包含它們自己的web.config檔案,並繼承上一目錄的配置設定。配置設定可以用於特定的應用程式,也可以用於整個機器。
強命名程式集有乙個發布者的公鑰/私鑰對簽名,其中公鑰/私鑰對唯一地標識了程式集的發布者,利用公鑰/私鑰對,我們可以對程式集進行唯一的標識,實施安全策略和版本策略。乙個程式集有兩種部署方式:私有方式和全域性方式。私有方式將程式集部署在應用程式的基目錄及其子目錄下。弱命名程式集只能夠進行私有部署。全域性方式將程式集部署在一些clr確知的地方,當clr搜尋程式集時,它就到這些地方去找。強命名程式集即可以進行私有部署,也可以進行全域性部署。乙個強命名程式集包含四個唯一標識程式集的特性:檔名(沒有副檔名),版本號,語言文化標識,和乙個公有金鑰標記(由公有金鑰產生的乙個值)。若想唯一標識乙個程式集,就必須首先獲取乙個公鑰/私鑰對,再將公鑰/私鑰對與程式集相關聯。
clr能夠將名稱相同但路徑不同的多個檔案載入到同乙個位址空間,這叫「並存執行」,這是解決」dell hell」的乙個關鍵技術。在解析乙個被引用的型別時,clr可以在下面三個地方之一找到該型別:(1)同乙個檔案。對同乙個檔案中型別的訪問在編譯時就確定了。clr直接從該檔案中載入被引用的型別。(2)不同的檔案,相同的程式集。(3)不同的檔案,不同的程式集。當被引用的型別在乙個不同的程式集檔案中時,clr會首先載入包含被引用程式集的清單所在的檔案。若該檔案沒有包含需要的型別,clr則會根據此清單檔案載入適當的檔案.
《 Ne框架程式設計》隨記 3
以往,每個應用程式程序都有自己的虛擬位址空間,通過位址空間的隔離來保證乙個程序不會干擾另乙個程序的執行。但通過驗證託管 可以確保不會訪問不該訪問的記憶體,因此可以乙個單獨的虛擬位址空間內執行多個託管應用程式。由於太多的程序會占用過多的系統資源,損傷系統效能,並限制系統可用的資源。因此在乙個程序中執行...
《 Ne框架程式設計》隨記 3
以往,每個應用程式程序都有自己的虛擬位址空間,通過位址空間的隔離來保證乙個程序不會干擾另乙個程序的執行。但通過驗證託管 可以確保不會訪問不該訪問的記憶體,因此可以乙個單獨的虛擬位址空間內執行多個託管應用程式。由於太多的程序會占用過多的系統資源,損傷系統效能,並限制系統可用的資源。因此在乙個程序中執行...
《 Ne框架程式設計》隨記 4
問 這段 裡有多少次裝箱操作?這裡首先建立了乙個未裝箱的int值型別 v 並將其初始化為4,然後,又建立了乙個object引用型別 o 並希望將其指向v,但是因為引用型別必須指向託管堆中的物件,所以會產生適當的il 將v進行裝箱,並將v的裝箱 拷貝 的位址存放在o中,隨後123被放入未裝箱的值型別v...