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

ng5*_*000 230 c# strongname assemblies visual-studio-2005 visual-studio

我已经为我的Visual Studio 2005项目(强名称)添加了一个弱命名的程序集.我现在收到错误:

"引用汇编'xxxxxxxx'没有强名称"

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

Dir*_*mar 205

要避免此错误,您可以:

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

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

签署第三方大会

签署罢工党的基本原则是

  1. 使用ildasm.exe并拆除组件并保存中间语言(IL):

    ildasm /all /out=thirdPartyLib.il thirdPartyLib.dll 
    
    Run Code Online (Sandbox Code Playgroud)
  2. 重建并签署程序集:

    ilasm /dll /key=myKey.snk thirdPartyLib.il
    
    Run Code Online (Sandbox Code Playgroud)

修复其他参考资料

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

解决此问题的方法是修补上面步骤1中生成的IL文件.您需要将B.dll的公钥标记添加到引用中.你通过调用得到这个标记

sn -Tp B.dll 
Run Code Online (Sandbox Code Playgroud)

这将给你以下输出:

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
Run Code Online (Sandbox Code Playgroud)

最后一行包含公钥令牌.然后,您必须在A.dll的IL中搜索对B.dll的引用,并按如下方式添加令牌:

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

  • 如果程序集也是未签名的,则可以使用未签名的程序集. (26认同)
  • 因此,对程序集进行签名是一种选择,我既不希望动态加载程序集也不对其进行签名。我知道,对于全局程序集缓存(GAC)而言,命名很严格。尽管如此,我不想使我的程序集成为GAC的一部分,并且它们也不是COM可见的。我记得部分记得我们可能会做的事情,这将允许在不签名的情况下使用该程序集。它在options属性左右。我想走那条路吗? (2认同)
  • .NET-fu的链接是一个很棒的资源 (2认同)
  • 虽然上述步骤适用于"大多数"情况,但它非常耗费时间并且容易出错,并且会因朋友汇编引用而失败.只需使用此实用程序自动完成所有操作(无耻插件):http://stackoverflow.com/a/19459609/564726 (2认同)

MrO*_*000 96

展开正在使用不具有"强名称密钥"的项目的项目文件,并查找.snk文件(.StrongNameKey).

Windows资源管理器中浏览到此文件(只是为了让您知道它在哪里).

回到没有"强名称密钥"的项目中的Visual Studio,做

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

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

我希望它有所帮助.


Mar*_*son 57

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

在此输入图像描述

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


Bru*_*Dev 47

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

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

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


Ale*_*tin 40

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


mat*_*scb 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 inD:/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


Mar*_*ers 14

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

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


Jan*_*rný 7

对我来说,问题是没有强名称的 NuGet 包。解决方案是从 NuGet安装StrongNamer,它会自动向所有引用的程序集添加强名称。只是简单地在项目中引用它就解决了我的问题。


Joe*_*Joe 5

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


Hen*_*ans 5

我是用nuget安装的ServiceStack dll遇到此问题的。原来,还有另一组标记为已签名的dll可用。并不是每个人都能找到答案,但是您可能只需要检查程序集的现有签名版本即可。ServiceStack.Signed