簡體   English   中英

如何修復“引用的程序集沒有強名稱”錯誤

[英]How to fix "Referenced assembly does not have a strong name" error

我在我的Visual Studio 2005項目中添加了一個弱命名的程序集(它是強命名的)。 我現在收到錯誤:

“引用的程序集 'xxxxxxxx' 沒有強名稱”

我需要簽署這個第三方程序集嗎?

為避免此錯誤,您可以:

  • 動態加載程序集,或
  • 簽署第三方程序集。

您將在.NET-fu: Signing an Unsigned Assembly (Without Delay Signing) 中找到有關簽署第三方程序集的說明。

簽署第三方程序集

簽署第三方協議的基本原則是

  1. 使用ildasm.exe反匯編程序集並保存中間語言 (IL):

     ildasm /all /out=thirdPartyLib.il thirdPartyLib.dll
  2. 重建並簽署程序集:

     ilasm /dll /key=myKey.snk thirdPartyLib.il

修復其他參考

上述步驟工作正常,除非您的第三方程序集 ( A.dll ) 引用另一個也必須簽名的庫 ( B.dll )。 您可以使用上述命令對A.dllB.dll進行反匯編、重建和簽名,但在運行時, B.dll 的加載將失敗,因為A.dll最初構建時引用了B.dll未簽名版本。

解決此問題的方法是修補上述步驟 1 中生成的 IL 文件。 您需要將 B.dll 的公鑰標記添加到引用中。 您通過調用獲取此令牌

sn -Tp B.dll 

這將為您提供以下輸出:

Microsoft (R) .NET Framework Strong Name Utility  Version 4.0.30319.33440
Copyright (c) Microsoft Corporation.  All rights reserved.

Public key (hash algorithm: sha1):
002400000480000094000000060200000024000052534131000400000100010093d86f6656eed3
b62780466e6ba30fd15d69a3918e4bbd75d3e9ca8baa5641955c86251ce1e5a83857c7f49288eb
4a0093b20aa9c7faae5184770108d9515905ddd82222514921fa81fff2ea565ae0e98cf66d3758
cb8b22c8efd729821518a76427b7ca1c979caa2d78404da3d44592badc194d05bfdd29b9b8120c
78effe92

Public key token is a8a7ed7203d87bc9

最后一行包含公鑰令牌。 然后,您必須在A.dll的 IL 中搜索對B.dll的引用並添加如下標記:

.assembly extern /*23000003*/ MyAssemblyName
{
  .publickeytoken = (A8 A7 ED 72 03 D8 7B C9 )                         
  .ver 10:0:0:0
}

展開使用沒有“強名稱密鑰”的項目的項目文件,並查找.snk文件 (.StrongNameKey)。

Windows 資源管理器中瀏覽到此文件(以便您知道它在哪里)。

回到沒有“具有強名稱鍵”的項目中的 Visual Studio,執行

  • 右鍵單擊項目文件
  • 選擇屬性
  • 選擇“簽名選項卡”(在左側)
  • 單擊復選框“簽署程序集”
  • 然后<Browse>到您之前找到的.snk文件

這應該夠了吧。 這解決了我在同一解決方案中使用另一個項目中的表單的一個項目的問題。

我希望它有幫助。

我正在尋找解決同樣問題的方法,取消勾選“簽署程序集”選項對我有用:

在此處輸入圖片說明

(您可能會注意到,屏幕截圖來自 Visual Studio 2010,但希望對某人有所幫助。)

我編寫了一個工具來自動對程序集進行強名稱簽名,包括您沒有源代碼的程序集或已放棄的項目。 它以簡單的方式使用了答案中描述的許多技術,沒有任何現有工具或過時說明的缺陷或缺點。

.NET 程序集強名稱簽名者

我希望這可以幫助任何需要簽署第三方程序集的人,而不必跳過箍到那里。

如果您的程序集也是未簽名的,則可以使用未簽名的程序集。

簽署第三方程序集對我有用:

引用的程序集沒有強名稱

我了解到,如果鏈接的文章不再有效,發布步驟會很有幫助。 所有功勞都歸功於Hiren Khirsaria

  1. 運行 Visual Studio 命令提示符並轉到 DLL 所在的目錄。

    For example, my DLL is located in D:/hiren/Test.dll

  2. 現在使用以下命令創建CIL文件。

    D:/hiren> ildasm /all /out=Test.il Test.dll (此命令生成代碼庫)

  3. 生成一個新的密鑰來簽署你的項目。

    D:/hiren> sn -k mykey.snk

  4. 現在使用ilasm命令為您的庫簽名。

    D:/hiren> ilasm /dll /key=mykey.snk Test.il

如何簽署未簽名的第三方程序集

  1. 打開 Visual Studio 的開發人員命令提示符。 此工具在您的 Window 程序中可用,可以使用默認的 Windows 搜索找到。
  2. 通過執行一次確保您的提示可以訪問以下工具: sn ildasmilasm
  3. 導航到 Cool.Library.dll 所在的文件夾
  4. sn –k Cool.Library.snk創建新的密鑰對
  5. ildasm Cool.Library.dll /out:Cool.Library.il反匯編庫
  6. move Cool.Library.dll Cool.Library.unsigned.dll保留原始庫作為備份
  7. ilasm Cool.Library.il /dll /resource=Cool.Library.res /key=Cool.Library.snk使用強名稱重新組裝庫
  8. powershell -command "& {[System.Reflection.AssemblyName]::GetAssemblyName($args).FullName} Cool.Library.dll"獲取程序集的完全限定名稱。 如果您必須在外部配置文件(如 web.config 或 app.config)中引用 DLL,您將需要此位。

我用 NuGet 安裝的 ServiceStack DLL 文件遇到了這個問題。 原來還有一組可用的 DLL 文件被標記為已簽名。 不是每個人的答案,但您可能只需要檢查程序集的現有簽名版本。

ServiceStack.Signed

對我來說,問題是沒有強名稱的 NuGet 包。 解決方案是從 NuGet 安裝StrongNamer ,它會自動向所有引用的程序集添加強名稱。 只是簡單地在項目中引用它就解決了我的問題。

我對一個強命名的應用程序有這個問題,然后不得不更改它以引用非強命名的程序集,所以我在項目屬性簽名部分取消選中“簽署程序集”,但它仍然抱怨。 我認為它必須是導致問題的某個地方的工件,因為我正確地做了所有其他事情,就是這樣。 我從它的 assemblyInfo.cs 文件中找到並刪除了行:[assembly: AssemblyKeyFile("yourkeyfilename.snk")]。 然后在此之后沒有構建投訴。

使用 ilmerge。 ilmerge 來自 Microsoft,但不隨 Visual Studio 或 SDK 一起提供。 不過你可以從 這里下載。 還有一個GitHub存儲庫。 你也可以從 NuGet 安裝:

PM> Install-Package ilmerge

使用:

ilmerge assembly.dll /keyfile:key.snk /out:assembly.dll /targetplatform:v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319 /ndebug

如果需要,您可以使用sn (來自 Visual Studio)生成您自己的密鑰文件:

sn -k key.snk

對我來說,我的問題是我安裝了兩個不同版本的相同 NuGet 包。

正如@Michal Stefanow 所說,刪除“簽名”選項卡下的“簽署程序集”復選標記的工作方式。

在此處添加是簽署您自己的文件和/或其他人的文件的最簡單方法。 您只需要在“構建后事件命令行”下添加這一行:

"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin\signtool.exe" sign /f "$(ProjectDir)\YourPfxFileNameHere.pfx" /p YourPfxFilePasswordHere /d "Your software title here" /du http://www.yourWebsiteHere.com /t http://timestamp.verisign.com/scripts/timstamp.dll /v "$(BaseOutputPath)$(TargetFileName)"

您可以簽署其他人的文件或您自己的文件,而且數量不限。

在此處輸入圖片說明

情況:您在解決方案 X、Y 中有項目 A、B、C、D

X 中的項目 A、B、C 項目 A、C、D 中的 Y

我需要在項目 A 中使用項目 C,但后來我不使用了。 在 bin Debug 項目 A 中有 C.dll。

如果我編譯解決方案 X,一切都很好(在這個解決方案中,我刪除了引用 A -> C。),但在解決方案 Y 我得到這個問題。

解決辦法是刪除工程A bin Debug中的C.dll

首先確保解決方案中所有項目的所有 NuGet 包都處於同一版本。 例如,您不希望一個項目引用 NLog 4.0.0.0 而另一個項目引用 NLog 4.1.0.0。 然后嘗試重新安裝 NuGet 包

Update-Package -reinstall

我的程序集 A 引用了三個第三方程序集,只有兩個包含在我的程序集 B 的引用中,也引用了 A。

更新包命令添加了對第三方程序集的缺失引用,錯誤消失了。

我已經在我的Visual Studio 2005項目(即強命名)中添加了一個弱命名的程序集。 我現在收到錯誤:

“引用的程序集“ xxxxxxxx”沒有強名稱”

我需要簽署該第三方程序集嗎?

我添加了 NuGet 包“StrongNamer”,我的問題解決了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM