程式集的概念
因為不同的公司可能會開發出有相同名字的程式集來,如果這些程式集都被複製到同一 個相同的目錄下,最後一個安裝的程式集將會代替前面的程式集。這就是著名的Windows “DLL Hell”出現的原因。
很明顯,簡單的用檔案名稱來區分程式集是不夠的,CLR需要支持某種機制來唯一的標識一個程式集。這就是所謂的強命名程式集。
一個強命名程式集包含四個唯一標誌程式集的特性:檔案名稱(沒有擴展名),版本號,語言文化信息(如果有的話),公有秘鑰。
這些信息存儲在程式集的清單(manifest)中。清單包含了程式集的元數據,並嵌入在程式集的某個檔案中。
如果一個公司想唯一的標識它的程式集,那么它必須首先獲取一個公鑰/私鑰對,然後將共有秘鑰和程式集相關聯。不存在兩個兩個公司有同樣的公鑰/私鑰對的情況,正是這種區分使得我們可以創建有著相同名稱,版本和語言文化信息的程式集,而不引起任何衝突。
與強命名程式集對應的就是所謂的弱命名程式集。(其實就是普通的沒有被強命名的程式集)。兩種程式集在結構上是相同的。都使用相同的PE檔案格式,,以及清單(manifest)。二者之間真正的區別在於:強命名程式集有一個發布者的公鑰/私鑰對簽名,其中的公鑰/私鑰對唯一的標識了程式集的發布者。利用公鑰/私鑰對,我們可以對程式集進行唯一性識別、實施安全策略和版本控制策略,這種唯一標識程式集的能力使得應用程式在試圖綁定一個強命名程式集時,CLR能夠實施某些“已確知安全”的策略(比如只信任某個公司的程式集)。
使用原因
microsoftmicrosoftmicrosoft
強名稱程式集在以下方案中有用:
•你希望啟用強名稱程式集將引用的程式集,或希望允許其他強名稱程式集friend訪問你的程式集。
•應用程式需要訪問同一程式集的各種版本。這意味著你需要在同一應用程式域中並排載入某程式集的不同版本,且各版本互不衝突。例如,如果在具有相同簡單名稱的程式集中存在API的不同擴展,強命名將為該程式集的每個版本提供唯一標識。
•你不希望程式集的使用對應用程式性能產生負面影響,所以你想要非特定於域的程式集。這就要求進行強命名,因為非特定於域的程式集必須安裝在全局程式集快取中。
•如果你希望通過套用發布伺服器策略來集中應用程式的服務,則意味著程式集必須安裝在全局程式集快取中。
如果你是開源開發人員且希望利用強命名程式集的標識優勢,不妨簽入與原始碼管理系統內程式集相關聯的私鑰。