如何修复“引用程序集没有强名称”错误?

时间:2008-12-01 17:16:55

标签: c# visual-studio visual-studio-2005 assemblies strongname

我在我的Visual Studio 2005项目(强名称)中添加了一个名称较弱的程序集。我现在收到错误:

  

“引用程序集'xxxxxxxx'没有强名称”

我是否需要签署此第三方程序集?

16 个答案:

答案 0 :(得分:198)

要避免此错误,您可以:

  • 动态加载程序集,或
  • 签署第三方程序集。

您可以在 .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
    
  3. 修复其他参考资料

    除非您的第三方程序集( A.dll )引用另一个也必须签名的库( B.dll ),否则上述步骤可以正常工作。您可以使用上面的命令反汇编,重建和签署 A.dll B.dll ,但在运行时,加载 B.dll 将失败,因为 A.dll 最初构建时引用了 B.dll unsigned 版本。

    此问题的解决方法是修补上面步骤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
    }
    

答案 1 :(得分:93)

展开项目文件,使用没有“强名称密钥”的项目,并查找.snk文件(.StrongNameKey)。

浏览Windows Explorer中的此文件(只是为了让您知道它在哪里)。

返回项目中的Visual Studio,该项目没有“强名称密钥”,请执行

  • 右键单击项目文件
  • 选择属性
  • 选择“签名标签”(左侧)
  • 单击“签署程序集”复选框
  • 然后<Browse>到您之前找到的.snk文件

这应该可以解决问题。这解决了我在同一解决方案中使用另一个项目中的表单的一个项目的问题。

我希望它有所帮助。

答案 2 :(得分:54)

我正在寻找解决同样问题的方法,并且不勾选“签署程序集”选项对我有用:

enter image description here

(您可能会注意到屏幕截图来自VS2010,但希望它可以帮助某人)

答案 3 :(得分:45)

我编写了一个工具来自动强化标记程序集,包括那些没有源代码的程序集或已经放弃的项目。它以简单的方式使用了答案中描述的许多技术,没有现有工具或过时指令的任何缺陷或缺点。

http://brutaldev.com/post/2013/10/18/NET-Assembly-Strong-Name-Signer

希望这有助于任何需要签署第三方议会的人,而不必跳过篮球去那里。

答案 4 :(得分:40)

如果程序集也是未签名的,则可以使用未签名的程序集。

答案 5 :(得分:22)

签署第三方程序集对我有用:

http://www.codeproject.com/Tips/341645/Referenced-assembly-does-not-have-a-strong-name

修改: 我了解到,如果链接的文章不再有效,发布步骤会很有帮助。所有功劳都归Hiren Khirsaria所示:

  1. 运行visual studio命令提示符并转到DLL所在的目录。

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

  2. 现在使用以下命令创建IL文件。

    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

答案 6 :(得分:13)

How to sign an unsigned third-party assembly

  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,则需要此位。

答案 7 :(得分:5)

我有一个强烈命名的应用程序的问题,然后必须更改它以引用非强名称的程序集,所以我取消选中&#39;签署程序集&#39;在项目属性签名部分,但仍然抱怨。我认为它必须是一个造成问题的工件,因为我做了其他正确的事情而且就是这样。我从assemblyInfo.cs文件中找到并删除了行:[assembly:AssemblyKeyFile(&#34; yourkeyfilename.snk&#34;)]。 然后没有建立投诉。

答案 8 :(得分:5)

我在使用nuget安装的ServiceStack dll时遇到了这个问题。事实证明,还有另一组可用的标记已签名。不会成为每个人的答案,但您可能只需要检查程序集的现有签名版本。 ServiceStack.Signed

答案 9 :(得分:2)

老问题,但我很惊讶没有人提到过ilmerge。 ilmerge来自Microsoft,但未附带VS或SDK。您可以从here下载它。还有一个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(来自VS)生成自己的密钥文件:

sn -k key.snk

答案 10 :(得分:1)

删除&#34;在&#34;签名&#34; 标签下签署程序集&#34; 复选标记,正如@Michal Stefanow所说。< / p>

在这里添加是签署自己的文件和/或其他人的文件的最简单方法。您只需要在&#34;构建后事件命令行&#34;:

下添加此行
"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)"

您可以根据需要签署其他人的文件或您自己的文件。

enter image description here

答案 11 :(得分:1)

对我来说,我的问题是我有两个安装了不同版本的相同NuGet包。

答案 12 :(得分:1)

情况: 您在解决方案X,Y中有项目A,B,C,D

X中的项目A,B,C Y中的A,C,D项目

我需要在项目A中使用项目C,但是以后我不使用。在bin调试项目A中有C.dll。

如果我编译解决方案X,一切都很好(在此解决方案中,我删除引用A->C。),但是在解决方案Y中,我遇到了这个问题。

解决方案是删除项目A bin调试中的C.dll

答案 13 :(得分:1)

对我来说,问题是一个没有强名称的NuGet软件包。解决方案是从NuGet安装StrongNamer,这会自动为所有引用的程序集添加强名称。只是在项目中引用它即可解决我的问题。

答案 14 :(得分:1)

我添加了 NuGet 包“StrongNamer”,我的问题解决了。

答案 15 :(得分:0)

首先请确保解决方案中所有项目的所有nuget软件包都具有相同的版本。例如您不希望一个项目引用NLog 4.0.0.0,而另一个项目引用NLog 4.1.0.0。然后尝试使用重新安装nuget软件包

更新包-重新安装

我的程序集A引用了3个第三方程序集,而我的程序集B也引用了2个第三方程序集。

update package命令添加了对第3方程序集的缺失引用,错误消失了。