古詩詞大全網 - 藝術簽名 - 如何為沒有源碼的DLL文件添加強名稱

如何為沒有源碼的DLL文件添加強名稱

為沒有源碼的DLL文件添加強名稱如果項目中引用了其他沒有源碼的dll文件,並且此dll文件是沒有強名稱的程序集,則編譯時會出現類似 "Assembly generation failed -- 引用的程序集 'xxxxxxxxxxx' 沒有強名稱" 這樣的錯誤。

我這裏引用的是Interop.Scripting.dll程序集,它不是強名稱的,則需要進行以下操作:

1.打開SDK 命令提示窗口;

2.創建壹個新的隨機密鑰對:

sn -k Interop.Scripting.snk

3.反編譯目標程序集

ildasm Interop.Scripting.dll /out=Interop.Scripting.il

3.重新編譯,附帶強命名參數

ilasm Interop.Scripting.il /dll /resource=Interop.Scripting.res /key=Interop.Scripting.snk /optimize

4.驗證簽名信息

sn -v Interop.Scripting.dll

OK,將生成的dll文件重新引入到項目中然後編譯。

那麽什麽叫強命名程序集呢?我們知道,以前在Windows下開發程序時常會遭遇著名的“DLL Hell”問題,即動態鏈接庫的向後兼容問題。微軟在.Net產生前曾嘗試使用COM組件的方式來解決DLL Hell問題,即使用Guid來唯壹的標識每壹個COM組件。但是,實際上使用COM組件(包括版本升級)也是壹件頗為麻煩的事:為了運行COM組件就必須在組冊表中對其進行註冊,重新編譯有可能破壞Guid從而導致原來引用此COM組件的程序不能正確運行,等等。

在.Net中,微軟引入了壹種新的解決方案:強命名程序集(Strong Name),以及與之配套的全局程序集緩存(GAC)來解決這個問題。

我們知道,.Net使用Name、Version、Culture、PublicToken四個屬性來唯壹標識壹個程序集,而不同產品前三個屬性(Name、Version和Culture)完全相同的情況是有可能發生的,如此壹來,這唯壹標識程序集可重任就落到PublicToken的頭上了。強命名的程序集正是使用RSA來保證PublicToken的唯壹性,因為在理論上,非對稱算法RSA生成的公鑰/私鑰對不會重復。.Net正是通過在編譯項目時將指定的公鑰/私鑰對寫入程序集來保證其唯壹性。

對於全局程序集緩存(GAC),MSDN是這樣介紹的:安裝有公***語言運行庫的每臺計算機都具有稱為全局程序集緩存的計算機範圍內的代碼緩存。全局程序集緩存中存儲了專門指定給由計算機中若幹應用程序***享的程序集。

在開發壹般的、非***享的程序時,我們不需要使用強命名的程序集,僅將項目(Project)編輯成.DLL或者.EXE即可。但是,如果我們開發的是組件庫、框架時,通過對程序集進行強命名,並使用將其部署到GAC中,可以保證我們的程序集不會出現版本問題。