程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 關於程序集生成失敗,程序集生成失敗

關於程序集生成失敗,程序集生成失敗

編輯:C#入門知識

關於程序集生成失敗,程序集生成失敗


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

-------------------------------------------------------------------

 

為沒有源碼的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文件重新引入到項目中然後編譯。   http://t.qq.com/baijialeyi6756

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved