強命名程序集(strong name assembly)的概念
因為不同的公司可能會開發出有相同名字的程序集來,如果這些程序集都被復製到同一 個相同的目錄下,最後一個安裝的程序集將會代替前面的程序集。這就是著名的windows “dll hell”出現的原因。
很明顯,簡單的用文件名來區分程序集是不夠的,clr需要支持某種機製來唯一的標識一個程序集。這就是所謂的強命名程序集。
一個強命名程序集包含四個唯一標志程序集的特性:文件名(沒有擴展名),版本號,語言文化信息(如果有的話),公有秘鑰。
這些信息存儲在程序集的清單(manifest)中。清單包含了程序集的元數據,並嵌入在程序集的某個文件中。
下面的字符串標識了四個不同的程序集文件:
“mytype, version=1.0.1.0,
culture=neutral, publickeytoken=bf5779af662fc055”
“mytype, version=1.0.1.0,
culture=en-us, publickeytoken=bf5779af662fc055”
“mytype, version=1.0.2.0,
culture=neturl, publickeytoken=bf5779af662fc055”
“mytype, version=1.0.2.0,
culture=neutral, publickeytoken=dbe4120289f9fd8a”
如果一個公司想唯一的標識它的程序集,那麽它必須首先獲取一個公鑰/私鑰對,然後將共有秘鑰和程序集相關聯。不存在兩個兩個公司有同樣的公鑰/私鑰對的情況,正是這種區分使得我們可以創建有着相同名稱,版本和語言文化信息的程序集,而不引起任何衝突。
與強命名程序集對應的就是所謂的弱命名程序集。(其實就是普通的沒有被強命名的程序集)。兩種程序集在結構上是相同的。都使用相同的pe文件格式,pe表頭,clr表頭,元數據,以及清單(manifest)。二者之間真正的區別在於:強命名程序集有一個發佈者的公鑰/私鑰對簽名,其中的公鑰/私鑰對唯一的標識了程序集的發佈者。利用公鑰/私鑰對,我們可以對程序集進行唯一性識別、實施安全策略和版本控製策略,這種唯一標識程序集的能力使得應用程序在試圖綁定一個強命名程序集時,clr能夠實施某些“已確知安全”的策略(比如衹信任某個公司的程序集)。 |
|
|