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