引用程序集沒有強名稱解決方案


一、什么是強名稱

強名稱是一個由程序集的標識組成並通過公鑰和數字簽名(針對該程序集生成)加強的名稱,其中的標識包括程序集的簡單文本名稱、版本號和區域性信息。

由於程序集清單包含構成程序集實現的所有文件的文件散列,因此只對程序集中包含程序集清單的一個文件生成數字簽名就足夠了。強名稱相同的程序集應該是相同的。

1、為什么要使用強名稱簽名

通過簽發具有強名稱的程序集,您可以確保名稱的全局唯一性。強名稱還特別滿足以下要求:

  • 強名稱依賴於唯一的密鑰對來確保名稱的唯一性。任何人都不會生成與您生成的相同的程序集名稱,因為用一個私鑰生成的程序集的名稱與用其它私鑰生成的程序集的名稱不相同。
  • 強名稱保護程序集的版本沿襲。強名稱可以確保沒有人能夠生成您的程序集的后續版本。用戶可以確信,他們所加載的程序集的版本出自創建該版本的同一個發行者。
  • 強名稱提供可靠的完整性檢查。通過.NET框架安全檢查后,即可確信程序集的內容在生成后未被更改過。但請注意,強名稱中或強名稱本身並不暗含某一級別的信任,例如由數字簽名和支持證書提供的信任。
  • 在引用具有強名稱的程序集時,您應該能夠從中受益,例如版本控制和命名保護。如果此具有強名稱的程序集以后引用了具有簡單名稱的程序集,則您將失去使用具有強名稱的程序集帶來的好處,並依舊會產生DLL沖突。因此,具有強名稱的程序集只能引用其他具有強名稱的程序集。

注意:強名稱的應用程序只能引用強名稱的dll,不能引用未強名稱的dll,但是未強名稱的dll可以引用強名稱的dll。

二、如何設置強名稱

上面我們講了什么是強簽名,以及強簽名的好處,下面我們來看看如何給應用程序設置強名稱。

1、應用程序有源代碼

打開vs tool command,如下圖所示:

1、生成公鑰

然后進入要設置強名稱的dll文件所在的路徑,使用下面的命令生成簽名公鑰:

sn -k StrongName.snk

如下圖所示:

2、設置簽名公鑰

將公鑰加入項目中,並設置項目屬性,設置簽名公鑰:

最后重新生成項目即可。

1、應用程序沒有源代碼

如果項目中引用了其它第三方的dll文件,而且還沒有源代碼,並且此dll文件是沒有強名稱的程序集,則在編譯時會出現類似“程序集生成失敗--引用的程序集XXX沒有強名稱”。

比如我在程序中使用到了Dapper,而Dapper是沒有強名稱的,所以生成的時候報錯了,如下圖所示:

這時我們就需要把Dapper變成有強名稱的程序集。

1、打開SDK命令提示窗口

我們這里以VS 2012為例打開SDK命令提示窗口,如下圖所示:

然后需要進入Dapper.dll文件所在的目錄:

2、創建一個新的隨機密鑰對

使用下面的命令生成一個隨機的密鑰對。

sn -k Dapper.snk

如下圖所示:

3、反編譯目標程序集

使用下面的命令反編譯目標程序集,該指令會反匯編該dll並生成Dapper.il,如果該dll含有嵌入的resource,則會有Dapper.res文件產生,並有相應的嵌入資源文件產生。

ildasm Dapper.dll /out=Dapper.il

如下圖所示:

4、重新編譯,附帶強命名參數

使用下面的命令重新編譯Dapper.dll,然后會附帶強命名參數

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文件也使用同樣的方式進行處理。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM