1. 程式集由組件中繼資料、類型中繼資料、中繼語言代碼和資源構成。其中組件中繼資料的一個重要組織部分是資訊清單,
它描述了本程式集和引用該程式集所需要的所有資訊,並列出了所有的依賴關係。清單由以下部分組成:
(1).標識(名稱、版本、文化和公開金鑰)。公開金鑰用於惟一地標識程式集。
(2).屬於該程式集的一個檔案清單。一個程式集可以擁有一到無數個檔案。
(3).該程式集引用的程式集的列表。在資訊清單中說明了在程式集中使用的所有程式集,以及它們的版本號碼和公開金鑰。
(4).一組許可請求---運行該程式集需要的許可。
(5).匯出的類型,這些類型是在程式集引用的模組中定義的。
2. 在一個程式集中可以有不同的命名空間,一個命名空間也可以分布在多個程式集中。
3. 程式集分為私用組件和共用組件。在引用私用組件時,如果程式集是個exe檔案,不能用添加引用的方式引用它,
應該把它手動拷貝到目標目錄下。如果是.dll檔案可以使用添加引用的方式,引用之後系統會自動在目標目錄下建立該程式集的副本,
無需手動拷貝。對於共用組件,則需要將其安裝到全域組件快取中,gacutil.exe工具可以在安裝程式的指令碼中調用。
另外,如果查看全域組件快取,可以開啟C:\Windows\Assembly檔案夾查看。
gacutil /l 顯示全域組件快取中的所有程式集。
gacutil /i mydll 把共用組件mydll安裝到全域組件快取中。
gacutil /u mydll 卸載mydll程式集。
引用共用組件的方法和引用私人的dll程式集的方式是一樣的,只是系統不會再把dll的副本拷貝到你的目標目錄下,
而是從組件快取中載入該程式集。
4.程式集的強名
共用組件最關鍵的是要有一個全域惟一的名稱,這個名稱在.NET中叫做強名。強名由以下部分組成:
(1).程式集本身的名稱
(2).版本號碼。有了版本號碼,可以同時使用同一個程式集的不同版本。不同的版本可以同時存在,並可以同時載入到同一個進程上。
(3).公開金鑰,它可以保證強式名稱的獨一無二。它也可以保證引用的程式集不會被篡改或代替。
(4).文化。
建立強名檔案:
在命令列使用sn –k mykey.snk 就可以產生一個公開金鑰/私密金鑰對,並把它存到snk檔案中。
私密金鑰用來為組件進行數位簽章,公開金鑰被引用該程式集的程式驗證該程式集時使用。同時,公開金鑰也成為了程式集強名的一部分。
具有強名的程式集,通過ildasm反編譯工具查看時,可以在資訊清單中看到這個公開金鑰。
5. 關於伺服器組件(Enterprise Services)
(1).服務元件需要有強式名稱。
(2).應當在"全域組件快取"(GAC) 中註冊服務元件,因為這些組件是系統層級的資源。伺服器應用程式要求安裝在 GAC 中,
庫應用程式則不要求這樣(但是建議安裝在 GAC 中)。
(3).您可以通過延遲註冊自動向 COM+ 註冊服務元件,也可以通過 Regsvcs.exe 工具 + 生產力手動註冊。
自動註冊(部署):
如果啟動了使用服務元件的.NET客戶應用程式,就會自動設定COM+應用程式。所有派生於ServicedComponent的類都是這樣。
自動部署的一個重要的缺點是,在自動部署時,客戶應用程式需要有系統管理權限。如果客戶應用程式是ASP.NET應用程式,
ASP.Net運行庫一般沒有系統管理權限。所以自動部署僅用於開發階段。因此,對於開發階段來說,這帶來了很大方便,在每次建立了
服務元件之後,都不用手動部署。
手工註冊(部署):
使用命令:regsvcs SimpleServer.dll就可以把程式集SimpleServer註冊為一個COM+應用程式。
程式集是 .NET 架構應用程式的主要構造塊。它是一個功能集合,並以單個實現單元(一個或多個檔案)的形式產生、版本化和部署。所有託管類型和資源或者只在其實現單元中標記為可訪問,或者在該單元外由代碼標記為可訪問。
程式集通過其清單(每個程式集不可缺少的部分)進行自我描述。
建立程式集標識(以文本名稱的形式)、版本、地區性和數位簽章(如果程式集將在應用程式間共用)。
定義組成程式集實現的檔案(按名稱和檔案散列)。
指定組成程式集的類型和資源,包括從程式集匯出的類型和資源。
逐條列出其他程式集上的編譯時間依賴項。
指定程式集正確運行所需的許可權集
命名空間名稱和程式集名稱之間的差異是什嗎?
命名空間是類型的邏輯命名方案,此方案中簡單的類型名稱(如 MyType)用以點分隔的分層名稱開頭。這樣的命名方案完全受開發人員控制。例如,類型 MyCompany.FileAccess.A 和 MyCompany.FileAccess.B 可能在邏輯上應具有與檔案訪問相關的功能。.NET 架構使用分層命名方案將類型分為相關功能(例如 ASP.NET 應用程式架構)或遠端功能的邏輯類別。設計工具可以利用命名空間使開發人員在代碼中瀏覽和參考型別更容易。命名空間的概念與程式集的概念無關。單個程式集可以包含分層名稱具有不同命名空間根的類型,而邏輯命名空間根可以跨越多個程式集。在 .NET 架構中,命名空間是邏輯設計時命名便利,而程式集在運行時建立類型的名稱範圍。
什麼是專用程式集和共用組件?
專用程式集僅由單個應用程式使用,並儲存在該應用程式的安裝目錄中(或其中的子目錄中)。共用組件是一個可以由多個應用程式引用的程式集。為了共用組件,必須給予該程式集一個加密的強式名稱(有時又稱強式名稱),為此目的顯式產生程式集。相比之下,專用程式集名稱只需在使用它的應用程式中是唯一的。
通過區分專用程式集和共用組件,我們以顯式決策的形式引入共用概念。只需將專用程式集部署到應用程式目錄,即可保證該應用程式只與用來組建和部署它的位一起運行。對專用程式集的引用只被本地解析到專用應用程式目錄。
可以舉出多個產生和使用共用組件的理由,如表示版本原則的能力。共用組件有一個加密的強式名稱,這意味著只有此程式集的作者具有產生程式集新版本的密鑰。因此,如果您產生一個策略語句,表明自己希望接受程式集的新版本,則應確信版本更新將受作者的控制和驗證。否則,您不必接受它們。
對於本地安裝的應用程式,共用組件通常被顯式安裝到全域組件快取中(由 .NET 架構維護的程式集的本機快取)。.NET 架構版本管理功能的關鍵是:下載的代碼不影響本地安裝的應用程式的執行。下載的代碼放置在特殊的下載快取中,並且在電腦上不是全域可用的,即使以共用組件的形式產生了某些下載組件。
.NET 架構隨附的類均以共用組件的形式產生。
形象的舉例:
如果說命名空間是類庫的邏輯組織形式,那麼程式集就是類庫的物理組織形式。只有同時指定類型所在的命名空間及實現該類型的程式集,才能完全限定該類型。(摘抄自《精通.NET核心技術--原來與架構》 電子工業出版社)
例如我們要用A類,則需要把包含A類的程式集(即*.DLL)引用到該工程中(物理);而在程式中要聲明A類的命名空間(邏輯)。
程式集就是程式的集合啊,可以理解為一個項目中的一堆程式,一般一個項目是一個程式集,在項目中右鍵屬性裡面可以設定程式集的名字。(理解成dll或exe也差不多)
程式集也不是物理組織的,例如:一個檔案可以包含多個程式集,一個程式集也可以分成幾個檔案。
名稱空間是類型的一種邏輯命名方案,其中簡單類型名稱(如 MyType)前面帶有用點分隔的階層名稱。這樣的命名方案完全在開發人員的控制之下。例如,鍵入 MyCompany.FileAccess.A 和 MyCompany.FileAccess.B 在邏輯上將會具有與檔案訪問相關的功能。.NET 架構使用一種階層命名方案,用於將類型按相關功能的邏輯類別進行分組,例如,ASP.NET 應用程式架構或遠端功能。設計工具可以利用名稱空間使開發人員更容易在代碼中瀏覽和參考型別。名稱空間的概念與程式集的概念之間沒有任何聯絡。一個程式集可以包含其階層名稱具有不同名稱空間根的類型,而一個邏輯名稱空間根可以跨越多個程式集。在 .NET 架構中,名稱空間是在設計時進行邏輯命名的便捷方式,而程式集在運行時為類型建立名稱範圍。