.Net解決引用程序集沒有強(qiáng)名稱報(bào)錯(cuò)
一、什么是強(qiáng)名稱
強(qiáng)名稱是一個(gè)由程序集的標(biāo)識(shí)組成并通過公鑰和數(shù)字簽名(針對(duì)該程序集生成)加強(qiáng)的名稱,其中的標(biāo)識(shí)包括程序集的簡(jiǎn)單文本名稱、版本號(hào)和區(qū)域性信息。
由于程序集清單包含構(gòu)成程序集實(shí)現(xiàn)的所有文件的文件散列,因此只對(duì)程序集中包含程序集清單的一個(gè)文件生成數(shù)字簽名就足夠了。強(qiáng)名稱相同的程序集應(yīng)該是相同的。
為什么要使用強(qiáng)名稱簽名
通過簽發(fā)具有強(qiáng)名稱的程序集,您可以確保名稱的全局唯一性。強(qiáng)名稱還特別滿足以下要求:
- 強(qiáng)名稱依賴于唯一的密鑰對(duì)來確保名稱的唯一性。任何人都不會(huì)生成與您生成的相同的程序集名稱,因?yàn)橛靡粋€(gè)私鑰生成的程序集的名稱與用其它私鑰生成的程序集的名稱不相同。
- 強(qiáng)名稱保護(hù)程序集的版本沿襲。強(qiáng)名稱可以確保沒有人能夠生成您的程序集的后續(xù)版本。用戶可以確信,他們所加載的程序集的版本出自創(chuàng)建該版本的同一個(gè)發(fā)行者。
- 強(qiáng)名稱提供可靠的完整性檢查。通過.NET框架安全檢查后,即可確信程序集的內(nèi)容在生成后未被更改過。但請(qǐng)注意,強(qiáng)名稱中或強(qiáng)名稱本身并不暗含某一級(jí)別的信任,例如由數(shù)字簽名和支持證書提供的信任。
- 在引用具有強(qiáng)名稱的程序集時(shí),您應(yīng)該能夠從中受益,例如版本控制和命名保護(hù)。如果此具有強(qiáng)名稱的程序集以后引用了具有簡(jiǎn)單名稱的程序集,則您將失去使用具有強(qiáng)名稱的程序集帶來的好處,并依舊會(huì)產(chǎn)生DLL沖突。因此,具有強(qiáng)名稱的程序集只能引用其他具有強(qiáng)名稱的程序集。
注意:強(qiáng)名稱的應(yīng)用程序只能引用強(qiáng)名稱的dll,不能引用未強(qiáng)名稱的dll,但是未強(qiáng)名稱的dll可以引用強(qiáng)名稱的dll。
二、如何設(shè)置強(qiáng)名稱
上面我們講了什么是強(qiáng)簽名,以及強(qiáng)簽名的好處,下面我們來看看如何給應(yīng)用程序設(shè)置強(qiáng)名稱。
1、應(yīng)用程序有源代碼
打開vs tool command,如下圖所示:

1、生成公鑰
然后進(jìn)入要設(shè)置強(qiáng)名稱的dll文件所在的路徑,使用下面的命令生成簽名公鑰:
sn -k StrongName.snk
如下圖所示:

2、設(shè)置簽名公鑰
將公鑰加入項(xiàng)目中,并設(shè)置項(xiàng)目屬性,設(shè)置簽名公鑰:

最后重新生成項(xiàng)目即可。
2、應(yīng)用程序沒有源代碼
如果項(xiàng)目中引用了其它第三方的dll文件,而且還沒有源代碼,并且此dll文件是沒有強(qiáng)名稱的程序集,則在編譯時(shí)會(huì)出現(xiàn)類似“程序集生成失敗--引用的程序集XXX沒有強(qiáng)名稱”。
比如我在程序中使用到了Dapper,而Dapper是沒有強(qiáng)名稱的,所以生成的時(shí)候報(bào)錯(cuò)了,如下圖所示:

這時(shí)我們就需要把Dapper變成有強(qiáng)名稱的程序集。
1、打開SDK命令提示窗口
我們這里以VS 2012為例打開SDK命令提示窗口,如下圖所示:

然后需要進(jìn)入Dapper.dll文件所在的目錄:

2、創(chuàng)建一個(gè)新的隨機(jī)密鑰對(duì)
使用下面的命令生成一個(gè)隨機(jī)的密鑰對(duì)。
sn -k Dapper.snk
如下圖所示:

3、反編譯目標(biāo)程序集
使用下面的命令反編譯目標(biāo)程序集,該指令會(huì)反匯編該dll并生成Dapper.il,如果該dll含有嵌入的resource,則會(huì)有Dapper.res文件產(chǎn)生,并有相應(yīng)的嵌入資源文件產(chǎn)生。
ildasm Dapper.dll /out=Dapper.il
如下圖所示:

4、重新編譯,附帶強(qiáng)命名參數(shù)
使用下面的命令重新編譯Dapper.dll,然后會(huì)附帶強(qiáng)命名參數(shù)
ilasm Dapper.il /dll /resource=Dapper.res /key=Dapper.snk /optimize
如下圖所示:

這樣就表示編譯成功了。
5、驗(yàn)證簽名信息
編譯成功以后,我們使用下面的命令來驗(yàn)證重新編譯后的dll文件是否帶有強(qiáng)名稱
sn -v Dapper.dll
如下圖所示:

這就表示重新編譯后的dll文件有了強(qiáng)名稱。
6、重新引用
編譯成功以后,會(huì)在目錄下面生成這么幾個(gè)文件:

可以看到:Dapper.dll這個(gè)文件是最新生成的,我們?cè)陧?xiàng)目里面重新引用上面新編譯的Dapper.dll文件,然后重新編譯項(xiàng)目:

可以看到,這時(shí)就不會(huì)報(bào)Dapper.dll沒有強(qiáng)名稱的錯(cuò)誤了。其它沒有強(qiáng)名稱的dll文件也使用同樣的方式進(jìn)行處理。
到此這篇關(guān)于.Net解決引用程序集沒有強(qiáng)名稱報(bào)錯(cuò)的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
AspNetAjaxPager,Asp.Net通用無刷新Ajax分頁控件,支持多樣式多數(shù)據(jù)綁定
最近閑來沒事,總結(jié)了一些asp.net分頁經(jīng)驗(yàn),為使用方便現(xiàn)在寫了一個(gè)可以通用的分頁控件:AspNetAjaxPager:,使用ajax技術(shù)實(shí)現(xiàn)無刷新分頁,能夠控制所有數(shù)據(jù)綁定控件的分頁,自己覺得效果還是挺不錯(cuò)的,現(xiàn)在奉獻(xiàn)給大家!2009-04-04
DataGridView展開與收縮功能實(shí)現(xiàn)
我們今天將要講到DataGridView之行的展開與收縮,包括功能是如何實(shí)現(xiàn)的,感興趣的小伙伴們可以參考一下2015-09-09
解決VS2015中沒有報(bào)表項(xiàng)(ReportViewer)的方法
VS2015中沒有報(bào)表項(xiàng)(ReportViewer),怎么辦?這篇文章主要為大家詳細(xì)介紹了解決VS2015中沒有報(bào)表項(xiàng)(ReportViewer)的方法,感興趣的小伙伴們可以參考一下2016-07-07
安裝.NET Framework進(jìn)度條卡住不動(dòng)的解決方案(推薦)
VS在安裝之前需要安裝.NET Framework,我安裝的是4.0版本。但是安裝進(jìn)度條到一半左右時(shí)就卡住不動(dòng)了。前前后后重試多次,還有幾次重新開機(jī),但都沒用,怎么解決呢,下面給大家分享下解決方案2016-12-12
數(shù)據(jù)庫SqlParameter 的插入操作,防止sql注入的實(shí)現(xiàn)代碼
今天學(xué)習(xí)了一下SqlParameter的用法,原來這么寫是為了防止sql注入,破壞數(shù)據(jù)庫的。并自己動(dòng)手連接了數(shù)據(jù)庫。2013-04-04

