天天看點

關于程式集生成失敗 -- 引用的程式集沒有強名稱的解決辦法關于程式集生成失敗 -- 引用的程式集沒有強名稱的解決辦法 

 我在petshop4程式中加入了一個業務外觀層,然後在業務邏輯層(petshop.bll)引用這個程式集,點“生成”,出現以下的錯誤:“程式集生成失敗 -- 引用的程式集沒有強名稱”,原因是petshop.bll是強命名程式集,強命名程式集不能用普通程式集造成的。

        那麼什麼叫強命名程式集呢?我們知道,以前在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中,可以保證我們的程式集不會出現版本問題。

那麼,如何建立強命名的程式集呢?以下是其步驟

使用sn工具來生成密鑰對。該工具位于安裝.net framework sdk的bin目錄中,在指令行中使用“ sn -k [驅動器号]:[放置密鑰的目錄][密鑰名稱].snk ”這樣的語句可以生成密鑰對。如,我們使用 sn -k c:/mysloutionkey.snk,可以把名為mysloutionkey.snk的密鑰對檔案生成到c盤根目錄下;

此時,該密鑰對并未與項目的程式集建立關聯,我們需要打開項目(project)的assemblyinfo.cs 檔案。此檔案具有一個程式集屬性清單,預設情況下,在 visual studio .net 中建立項目時将包括這些屬性。在代碼中修改名為“assemblykeyfile”的屬性,如下所示:

[assembly:assemblykeyfile("c:/mysloutionkey.snk")]

這樣,編譯該項目即生成強命名的程式集。

         根據以上的說法,這個錯誤的解決問題如下:

首先打開visual studio 2005指令提示(開始-->程式-->microsoft visual studio 2005-->visual studio  tools-->visual studio 2005指令提示),在其中輸入:sn  -k  petshop.ibll.snk回車,這樣就生成了 petshop.ibll.snk,在路徑c:/program files/microsoft visual studio 8/vc找到 petshop.ibll.snk檔案,放在ibll項目的根目錄也就是ibll目錄下,然後打開bll項目的assemblyinfo.cs,在裡面加入如下代碼行:[assembly: assemblykeyfile("petshop.ibll.snk")], 然後重新生成petshop.ibll項目,這樣一個強命名的程式集就生成了。

繼續閱讀