Dot-Net

程序集有一個強名稱,但我得到一個錯誤,說需要一個強名稱

  • October 24, 2020

我正在嘗試將第三方 COM dll 載入到我的應用程序中。一切都很好,但是當我執行應用程序時,我不斷從我的應用程序中收到此消息:

無法載入文件或程序集“程序集”、Version=1.0.0.0、Culture=neutral、PublicKeyToken=null’或其依賴項之一。需要強命名程序集。(來自 HRESULT 的異常:0x80131044)。

當我這樣做時,sn -vf "assembly"它說程序集是有效的。有沒有人見過這種行為?

嘗試載入的程序集沒有強名稱。這可以從您的消息中看出,它說PublicKeyToken=null。如果它有一個強名稱,它就會有一個公鑰令牌。

如果您在編譯或引用它給它起了一個強名稱,請嘗試在您的項目中再次引用它。也許您的項目仍然有舊的參考,並且正在嘗試載入未簽名的版​​本。

在使用 Mongo CSharp Driver 時,我已經看到了這種行為。從 1.10.0 及更高版本開始,他們停止提供強命名程序集,因此您必須自己簽名。

當我簽署提供的 3 個 dll 時;MongoDB.Bson、MongoDB.Driver 和 MongoDB.Driver.Core,我忽略了這些程序集的內置依賴結構。MongoDB.Driver 依賴於依賴於 MongoDB.Bson 的 MongoDB.Driver.Core。這意味著儘管我的程式碼引用了已簽名的程序集,但預編譯的程序集卻引用了它們所依賴的已簽名程序集。

一般來說,當你有這樣的依賴樹時,你會觀察到這種行為

Assembly1 -------> Assembly2
  |                   |
  |---> Assembly3 <---|

其中程序集 1 和 2 都依賴於程序集 3,但程序集 1 也依賴於程序集 2。它比循環依賴少了一步,這使得它非常罕見。

我將在 5 部分系列的第 4 部分中討論可用於簽署第 3 方 DLL 並解決此問題的流程和 SDK 工具。.NetFU 也有一篇關於該過程的好文章,但他們的頁面已被刪除。

引用自:https://stackoverflow.com/questions/32148475