閱讀389 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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

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

 我在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中,可以保證我們的程序集不會出現版本問題。

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

  1. 使用SN工具來生成密鑰對。該工具位於安裝.NET Framework SDK的Bin目錄中,在命令行中使用“ SN -k [驅動器號]:[放置密鑰的目錄][密鑰名稱].snk ”這樣的語句可以生成密鑰對。如,我們使用 SN -k C:/MySloutionKey.snk,可以把名為MySloutionKey.snk的密鑰對文件生成到C盤根目錄下;
  2. 此時,該密鑰對並未與項目的程序集建立關聯,我們需要打開項目(Project)的AssemblyInfo.cs 文件。此文件具有一個程序集屬性列表,默認情況下,在 Visual Studio .NET 中創建項目時將包括這些屬性。在代碼中修改名為“AssemblyKeyFile”的屬性,如下所示:

    [assembly:AssemblyKeyFile("C:/MySloutionKey.snk")]

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

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

首先打開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項目,這樣一個強命名的程序集就生成了。

最後更新:2017-04-02 06:51:20

  上一篇:go Ogre:render to texture
  下一篇:go JavaScript動態的為元素添加事件