我在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專案,這樣乙個強命名的程式集就生成了。
程式集強命名的作用
乙個經過強命名的程式集是無法被篡改的。比如微軟的system.dll這些程式集都是經過強命名的,我們只能夠引用它,無法修改它。如果平時不考慮版權問題我們可能很少會用到這個東西。我用乙個簡單的demo演示下強命名的作用.1 新建一解決方案 vesiontest 2 新建乙個控制台應用程式專案 vesi...
C 的命名空間namespace的作用
c 語言引入命名空間 namespace 這一概念主要是為了避免命名衝突,其關鍵字為 namespace。乙個工程專案或系統通常由不同的人員 模組化 來開發,當所有模組開發完成後,需要整合。此時,不同人命名的各種變數產生衝突的概率很高。如 因為個人習慣不同,a喜歡宣告int型變數flag 0 1用於...
c 作用域及命名空間
什麼是作用域 每乙個變數 函式 陣列 結構體 類 等實體都有其自己有效的作用範圍,這就是變數的作用域。在區域性變數中,區域性變數只在定義的函式範圍內有效 即從變數定義開始到函式結束被釋放。int fun a的作用域結束 在全域性變數中,全域性變數的作用域為從定義變數的位置開始到本原始檔結束。若全域性...