如何建立強命名程式集(strong name assembly)
建立乙個強命名程式集首先需要獲得乙個用強命名實用工具
(strong name utility,即sn.exe,.net sdk自帶)產生的金鑰。
下面簡要介紹一下sn.exe的一些用法。要產生乙個公鑰/私鑰對:
a)sn –k mycompany.keys
該命名告訴sn.exe建立乙個名為mycompany.keys的檔案。mycompany.keys檔案將包含以對以二進位制格式儲存的公有金鑰和私有金鑰。
b)檢視公有金鑰:
首先生成乙個只包含公有金鑰的檔案:sn –p
mycompany.keys mycompany.publickey
然後用-tp引數檢視:sn –tp mycompany.publickeys
public key is
00240000048000009400000006020000002400005253413
10004000001000100bb7214723ffc13901343df4b9c464ebf
7ef4312b0ae4d31db04a99673e8163768cc0a2a7062e731d
beb83b869f0509bf8009e90db5c8728e840e782d2cf928dae
35c2578ec55f0d11665a30b37f8636c08789976d8ee9fe9a5
c4a0435f0821738e51d6bdd6e6711a5acb620018658cce93
df37d7e85f9a0104a5845053995ce8
public key token is 2dc940d5439468c2
建立好了公鑰/私鑰對,建立強命名程式集就很容易了。只需要把system.reflection.assemblykeyfileattribute特性加入到源**中就可以了:?[assembly:assemblykeyfile("mycompany.keys")]
說明:公鑰/私鑰對檔案的副檔名可以是任意的(也可以沒有),因為編譯的時候都是以元資料的格式讀取的。
4.程式集的部署方式
乙個程式集有兩種部署方式:
a)私有方式
和應用程式部署在同一目錄下的程式集稱作私有部署程式集。弱命名程式集只能進行私有部署。
b)全域性方式
全域性部署方式將程式集部署在一些clr已確知的地方,當clr搜尋程式集時,它會知道到這些地方去找。強命名程式集既可以進行私有部署,也可以進行全域性部署。
5.如何部署強命名程式集(strong name assembly)和gac
a)gac的概念
如果乙個assembly要被多個應用程式訪問,那麼他就必須放在乙個clr已確知的目錄下,並且clr在探測到有對該assembly的引用時,它必須能自動到該目錄下尋找這個程式集。這個已確知的目錄稱作gac(global assembly cache),就是全域性程式集快取。它一般位於下面的目錄下::/windows/assembly/gac。
gac的作用就是提供給clr乙個已知的確定的目錄去尋找引用的程式集。
b)gac的內部結構
gac是乙個特殊的結構化的目錄,用windows explorer瀏覽你會以為它只是乙個包含很多程式集的普通目錄。其實不是這樣的,在命令列下檢視,你會發現它實際上包含很多子目錄,子目錄的名字和程式集的名稱是相同的,但它們都不是實際的程式集,實際的程式集位於程式集名對應的目錄下。比如進入gcfwk子目錄,我們會發現其中又有很多的子目錄。機器內每乙個安裝到gac的gcfwk.dll在gcfwk中都會有乙個子目錄。
這裡只有乙個目錄表明只有乙個版本的gcfwk程式集被安裝。實際的程式集儲存在每乙個對應的版本目錄下。目錄的名稱以下劃線的形式分割為「(version)_(culture)_(publickeytoken)」。
gcfwk的語言文化資訊為netture,就表示為0.0.0__bf5779af662fc055」。表示得意義是:「gcfwk, version=1.0.0.0, culture=neutral,publickeytoken=bf5779af662fc055」 如果語言文化資訊為」ja」,就表示」1.0.0.0_ja_bf5779af662fc055」
表示得意義是:「gcfwk, version=1.0.0.0, culture=ja, publickeytoken=bf5779af662fc055」
c)部署強命名程式集到gac
gac包含很多子目錄,這些子目錄是用一種演算法來產生的,我們最好不要手動將程式集拷貝到gac中,相反,我們應使用工具來完成這樣的工作。因為這些工具知道gac的內部結構j
在開發和測試中,最常用的工具就是gacutil.exe。在gac中註冊程式集跟com註冊差不多,但相對更容易:
1.把程式集新增到gac中:gacutil /i sample.dll (引數/i是安裝的意思)
2.把程式集移出gac gacutil /u sample.dll (引數/u就移除的意思)
注意:不能將乙個弱命名程式集安裝到gac中。
如果你試圖把弱命名程式集加入到gac中,會收到錯誤資訊:」
failure adding assembly to the cache: attempt to install an assembly without a strong name」
d)強命名程式集的私有部署
把程式集安裝到gac有幾個好處。首先,gac使得很多程式可以共享程式集,這從整體上減少了使用的物理記憶體;其次,我們很容易將乙個新版的程式集部署到gac中,並通過一種發布者策略(差不多就是一種重定向方法,比如將原來引用版本為1.0.0.0程式集的程式,通過更改它的配置檔案,轉而讓程式去引用版本為2.0.0.0的程式集)來使用新版本;最後,gac還提供了對不同版本程式集的並存(side-by-side)管理方式。但是,gac的安全策略通常只允許管理員更改,同時,向gac中安裝程式集也破壞了.net框架的簡單拷貝部署的許諾。
除了向gac或者以私有部署方式部署強命名程式集之外,我們還可以將強命名程式集部署在僅為一小部分程式知道的某個任意目錄下。配置每乙個應用程式的xml配置檔案,讓它們指向乙個公有目錄,這樣,在執行時,clr將知道到**去找這個強命名程式集。但這樣又有可能會引發」dll hell」的問題,因為沒有哪個程式可以控制這個程式集何時被解除安裝。這在.net中也是不被鼓勵的。
強命名策略:
生成公鑰與私鑰對,並對私鑰做嚴格的保護
生成:sn -k keyfile.snk 公鑰與私鑰對
抽取公鑰:sn -p keyfile.snk public.snk 從keyfile中抽取公鑰儲存到public.snk檔案中,以對程式集進行遲簽名
跳過驗證:sn -vr assembly 對assembly在開發用機上進行跳過驗證處理,該assembly不是已簽名的
簽名:sn -r assembly keyfile.snk 對assembly 進行遲簽名,這一步是在發布之前做
取消跳過驗證:sn -vu assembly 對assembly在開發用機上取消跳過驗證,該assembly這時是已簽名的
或取消所有:sn -vx 取消所有驗證
開發階段
assembly不是已簽名的,但是強命名的strong named,因此需要在開發機上做跳過驗證處理
發布階段
由私鑰控制者對assembly進行簽名,並在開發機上由開發人員自行取消跳過驗證
CLR 關於強命名程式集
如何建立強命名程式集 strong name assembly 建立乙個強命名程式集首先需要獲得乙個用強命名實用工具 strong name utility,即sn.exe,net sdk自帶 產生的金鑰。下面簡要介紹一下sn.exe的一些用法。要產生乙個公鑰 私鑰對 a sn k mycompan...
CLR 共享程式集和強命名程式集
2017年08月12日 23 36 52 生活常識 閱讀數 187 clr支援兩種型別的程式集 弱命名程式集 weakly named assembly 和強命名程式集 strongly named assembly 二者的區別 強命名程式集使用發布者的公鑰 私鑰進行了簽名。這一堆金鑰允許對程式集進...
CLR筆記 3 共享程式集合強命名程式集
3.1 兩種程式集,兩種部署 clr有兩種程式集,弱命名程式集和強命名程式集,二者基本一樣,區別 強命名程式集時用發布者的公鑰 私鑰對 進行了簽名,唯一性的標識了程式集的發布者。弱命名程式集只能私有部署,強命名程式集可以使用全域性部署,也可以私有部署。3.2 為程式集指派強名稱 乙個強命名的程式集包...