.Net解決引用程序集沒(méi)有強(qiáng)名稱報(bào)錯(cuò)
一、什么是強(qiáng)名稱
強(qiáng)名稱是一個(gè)由程序集的標(biāo)識(shí)組成并通過(guò)公鑰和數(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)名稱簽名
通過(guò)簽發(fā)具有強(qiáng)名稱的程序集,您可以確保名稱的全局唯一性。強(qiáng)名稱還特別滿足以下要求:
- 強(qiáng)名稱依賴于唯一的密鑰對(duì)來(lái)確保名稱的唯一性。任何人都不會(huì)生成與您生成的相同的程序集名稱,因?yàn)橛靡粋€(gè)私鑰生成的程序集的名稱與用其它私鑰生成的程序集的名稱不相同。
- 強(qiáng)名稱保護(hù)程序集的版本沿襲。強(qiáng)名稱可以確保沒(méi)有人能夠生成您的程序集的后續(xù)版本。用戶可以確信,他們所加載的程序集的版本出自創(chuàng)建該版本的同一個(gè)發(fā)行者。
- 強(qiáng)名稱提供可靠的完整性檢查。通過(guò).NET框架安全檢查后,即可確信程序集的內(nèi)容在生成后未被更改過(guò)。但請(qǐng)注意,強(qiáng)名稱中或強(qiáng)名稱本身并不暗含某一級(jí)別的信任,例如由數(shù)字簽名和支持證書提供的信任。
- 在引用具有強(qiáng)名稱的程序集時(shí),您應(yīng)該能夠從中受益,例如版本控制和命名保護(hù)。如果此具有強(qiáng)名稱的程序集以后引用了具有簡(jiǎn)單名稱的程序集,則您將失去使用具有強(qiáng)名稱的程序集帶來(lái)的好處,并依舊會(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)簽名的好處,下面我們來(lái)看看如何給應(yīng)用程序設(shè)置強(qiáng)名稱。
1、應(yīng)用程序有源代碼
打開(kāi)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)用程序沒(méi)有源代碼
如果項(xiàng)目中引用了其它第三方的dll文件,而且還沒(méi)有源代碼,并且此dll文件是沒(méi)有強(qiáng)名稱的程序集,則在編譯時(shí)會(huì)出現(xiàn)類似“程序集生成失敗--引用的程序集XXX沒(méi)有強(qiáng)名稱”。
比如我在程序中使用到了Dapper,而Dapper是沒(méi)有強(qiáng)名稱的,所以生成的時(shí)候報(bào)錯(cuò)了,如下圖所示:
這時(shí)我們就需要把Dapper變成有強(qiáng)名稱的程序集。
1、打開(kāi)SDK命令提示窗口
我們這里以VS 2012為例打開(kāi)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)證簽名信息
編譯成功以后,我們使用下面的命令來(lái)驗(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沒(méi)有強(qiáng)名稱的錯(cuò)誤了。其它沒(méi)有強(qiáng)名稱的dll文件也使用同樣的方式進(jìn)行處理。
到此這篇關(guān)于.Net解決引用程序集沒(méi)有強(qiáng)名稱報(bào)錯(cuò)的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
asp.net TreeView遞歸循環(huán)子節(jié)點(diǎn)生成樹(shù)形菜單實(shí)例
這篇文章主要介紹了asp.net TreeView遞歸循環(huán)子節(jié)點(diǎn)生成樹(shù)形菜單的方法,涉及asp.net遞歸算法及節(jié)點(diǎn)操作相關(guān)技巧,需要的朋友可以參考下2016-07-07ASP.NET?Core?6.0?基于模型驗(yàn)證的數(shù)據(jù)驗(yàn)證功能
這篇文章主要介紹了ASP.NET?Core?6.0?基于模型驗(yàn)證的數(shù)據(jù)驗(yàn)證,本文描述的數(shù)據(jù)驗(yàn)證方案,是基于官方的模型驗(yàn)證(Model validation),需要的朋友可以參考下2022-07-07.NET 6開(kāi)發(fā)TodoList應(yīng)用之使用AutoMapper實(shí)現(xiàn)GET請(qǐng)求
我們希望接受的請(qǐng)求和返回的值具有以下兩點(diǎn)需要遵循的原則:每個(gè)model被且只被一個(gè)API消費(fèi);每個(gè)model里僅僅包含API發(fā)起方希望包含的必要字段或?qū)傩浴utoMapper庫(kù)就是為了實(shí)現(xiàn)這個(gè)需求而存在的。本文將為大家介紹AutoMapper如何實(shí)現(xiàn)GET請(qǐng)求,需要的可以參考一下2021-12-12ASP.NET MVC下自定義錯(cuò)誤頁(yè)和展示錯(cuò)誤頁(yè)的方式
這篇文章主要為大家詳細(xì)介紹了ASP.NET MVC下自定義錯(cuò)誤頁(yè)和展示錯(cuò)誤頁(yè)的方式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11Asp.net程序優(yōu)化js、css實(shí)現(xiàn)合并與壓縮的方法
這篇文章主要介紹了Asp.net程序優(yōu)化js、css實(shí)現(xiàn)合并與壓縮的方法,使用第三方組件實(shí)現(xiàn)訪問(wèn)時(shí)將js與css文件壓縮并緩存在客戶端的效果,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-12-12Asp.Net Core基于JWT認(rèn)證的數(shù)據(jù)接口網(wǎng)關(guān)實(shí)例代碼
這篇文章主要給大家介紹了關(guān)于Asp.Net Core基于JWT認(rèn)證的數(shù)據(jù)接口網(wǎng)關(guān)的相關(guān)資料,文中通過(guò)示例代碼以及圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用Asp.net Core具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03