262

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

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

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

4

16 回答 16

226

为避免此错误,您可以:

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

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

签署第三方程序集

签署 thirp-party 的基本原则是

  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
}
于 2008-12-01T17:26:23.623 回答
104

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

在Windows 资源管理器中浏览到该文件(以便您知道它在哪里)。

回到没有“具有强名称键”的项目中的 Visual Studio,执行

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

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

我希望它有所帮助。

于 2012-07-10T07:27:54.573 回答
66

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

在此处输入图像描述

(您可能会注意到,屏幕截图来自 Visual Studio 2010,但希望它对某人有所帮助。)

于 2014-01-08T18:13:00.610 回答
56

我编写了一个工具来自动对程序集进行强名称签名,包括您没有源代码的程序集或已放弃的项目。它以简单的方式使用答案中描述的许多技术,没有现有工具或过时说明的任何缺陷或缺点。

.NET 程序集强名称签名者

我希望这可以帮助任何需要签署第三方程序集的人,而不必跳过铁环到达那里。

于 2013-10-18T21:52:11.473 回答
43

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

于 2012-06-02T16:04:34.943 回答
30

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

引用的程序集没有强名称

我了解到,如果链接的文章不再有效,发布步骤会很有帮助。所有功劳归功于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

于 2014-06-09T21:58:15.393 回答
15

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

  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,您将需要此位。
于 2015-05-10T11:35:20.457 回答
8

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

于 2020-11-22T22:46:06.400 回答
7

我使用 NuGet 安装的 ServiceStack DLL 文件遇到了这个问题。原来还有另一组标记为已签名的 DLL 文件可用。不会是每个人的答案,但您可能只需要检查您的程序集的现有签名版本。

ServiceStack.Signed

于 2017-03-03T15:55:32.133 回答
6

对于一个强命名的应用程序,我遇到了这个问题,然后必须更改它以引用非强命名程序集,所以我在项目属性签名部分取消选中“签署程序集”,但它仍然抱怨。我认为它必须是导致问题的某个地方的人工制品,因为我正确地完成了其他所有操作,仅此而已。我从它的 assemblyInfo.cs 文件中找到并删除了这一行: [assembly: AssemblyKeyFile("yourkeyfilename.snk")] 。然后没有构建投诉之后。

于 2013-10-16T23:47:12.367 回答
3

使用 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
于 2017-10-08T12:23:07.890 回答
2

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

于 2015-09-02T16:03:50.430 回答
1

正如@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)"

您可以签署其他人的文件或您自己的文件,并且可以根据需要签署任意数量的文件。

在此处输入图像描述

于 2015-03-11T15:43:25.963 回答
1

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

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

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

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

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

于 2018-12-13T08:07:40.133 回答
0

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

Update-Package -reinstall

我的程序集 A 引用了三个第三方程序集,而我的程序集 B 也引用了 A 的引用中只包含了两个。

缺少对第三方程序集的引用是由 update package 命令添加的,并且错误消失了。

于 2019-11-15T13:19:34.223 回答
0

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

于 2021-04-26T03:29:47.307 回答