首頁 > 軟體

.Net解決參照程式集沒有強名稱報錯

2022-03-24 10:00:16

一、什麼是強名稱

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

由於程式集清單包含構成程式集實現的所有檔案的檔案雜湊,因此只對程式集中包含程式集清單的一個檔案生成數位簽章就足夠了。強名稱相同的程式集應該是相同的。

為什麼要使用強名稱簽名

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

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

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

二、如何設定強名稱

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

1、應用程式有原始碼

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

1、生成公鑰

然後進入要設定強名稱的dll檔案所在的路徑,使用下面的命令生成簽名公鑰:

sn -k StrongName.snk

如下圖所示:

2、設定簽名公鑰

將公鑰加入專案中,並設定專案屬性,設定簽名公鑰:

最後重新生成專案即可。

2、應用程式沒有原始碼

如果專案中參照了其它第三方的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檔案也使用同樣的方式進行處理。

到此這篇關於.Net解決參照程式集沒有強名稱報錯的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com