如何解决“引用的程序集没有强名称”的错误?

我已经添加了一个弱命名的程序集到我的Visual Studio 2005项目(这是强烈命名)。 我现在得到的错误:

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

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

为了避免这个错误,你可以:

  • dynamic加载程序集,或者
  • 签署第三方大会。

您将在.NET-fu:签署一个未签名的程序集(无延迟签名)中find有关签署第三方程序集的说明。

签署第三方程序集

签署派对的基本原则是

  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进行反汇编,重build和签名,但是在运行时加载B.dll将失败,因为A.dll最初是通过引用未签名B.dll版本而构build的

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

最后一行包含公钥标记。 然后,您必须searchA.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资源pipe理器中浏览此文件(以便知道它在哪里)。

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

  • 右键单击项目文件
  • select属性
  • select“签名选项卡”(左侧)
  • 单击checkbox“签署程序集”
  • 然后将&ltBrowse>复制到之前find的.snk文件中

这应该够了吧。 这解决了一个项目在同一解决scheme中使用另一个项目中的一个项目的一个问题。

我希望它有帮助。

我正在寻找解决scheme,以解决同样的问题,并解除“唱歌大会”选项适用于我:

在这里输入图像描述

(正如你可能会注意到截图来自VS2010,但希望它会帮助某人)

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

我已经写了一个工具来自动强名称的程序集,包括你没有源代码的项目或已经被抛弃的项目。 它以简单的方式使用了答案中描述的许多技术,没有任何现有工具或date指示的缺陷或缺点。

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

希望这有助于任何需要签署第三方大会的人,而不必为了达到目的而跳槽。

签署第三方大会为我工作:

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. 现在使用下面的命令创buildIL文件。

    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的开发人员命令提示符。 该工具在您的Windows程序中可用,可以使用默认的Windowssearchfind。
  2. 通过执行一次,确保您的提示可以访问以下工具: sn ildasmilasm
  3. 导航到您的Cool.Library.dll所在的文件夹
  4. sn –k Cool.Library.snk创build一个新的密钥对
  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"获取程序集完全限定名称。 如果必须在外部configuration文件(如web.config或app.config)中引用该DLL,则需要这一点。

我有一个强烈命名的应用程序这个问题,然后不得不改变它,以引用一个非强命名的程序集,所以我没有选中“签署程序集”在项目属性签名部分,但它仍然抱怨。 我认为它必须是造成问题的某个地方的神器,因为我正确地做了所有其他的事情,就是这样。 我find并从其assemblyInfo.cs文件中删除了这行:[assembly:AssemblyKeyFile(“yourkeyfilename.snk”)]。 那之后再没有投诉。

我遇到了一个ServiceStack的DLL,我用nuget安装了。 事实certificate,还有另一套可用的标签签名。 不会成为每个人的答案,但你可能只需要检查你的程序集的现有签名版本。 ServiceStack.Signed

删除“Signing”标签下的“Sign the assembly”复选标记就像@Michal Stefanow所说的那样。

这里添加是签署自己的文件和/或其他人的文件的最简单的方法。 您只需要在“构build后事件命令行”下添加以下行:

 "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)" 

您可以签署其他人的文件或自己的​​文件,并可以任意多。

在这里输入图像描述

有时可能cmd找不到ildsmilasm的正确path,你可能会遇到问题,可能会感到困惑。那么你将不得不为它们提供完整的path,以获得完整的path使用cmd。

http://onlyforcoder.blogspot.in/2017/11/how-to-sign-unsigned-third-party.html

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

老问题,但我很惊讶没有人提到ilmerge呢。 ilmerge来自Microsoft,但没有附带VS或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(来自VS)生成自己的密钥文件:

 sn -k key.snk