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

276

我已将一个弱名称程序集添加到我的Visual Studio 2005项目中(该项目是强名称的)。 现在出现以下错误:

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

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


1
https://dev59.com/R3M_5IYBdhLWcg3wzmkw - user423430
2
这可能听起来像一个愚蠢的提示,但如果你发现无论你做什么都无法签名汇编,那就检查一下你的构建设置;记住,当你重新构建/清理时,VS不会清除其他架构(任何CPU、x64等),因此你可能正在查看来自另一个架构的过时dll。 - jrh
@jrh 我的构建一直告诉我我的项目没有强名称,但是我已经签名了!我甚至安装了StrongNamer nuget包,但它仍然抱怨程序集未签名。说实话,这种故障排除是最不愉快的事情之一。 - Vin Shahrdar
16个回答

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

如果需要,您可以使用 Visual Studio 中的 sn 生成自己的密钥文件:

sn -k key.snk

1
我在使用WireMock.Net时遇到了问题,最终解决了,但是花了一段时间来弄清楚PowerShell命令。特别是整个一堆/lib参数,最终才让ILMerge签署了程序集。 - François
1
1> Register-PackageSource -ProviderName NuGet -Name NuGet -Location http://www.nuget.org/api/v2 - François
1
2> Install-Package -Name ILMerge - François
1
3> $env:path += ';C:\Program Files\PackageManagement\NuGet\Packages\ilmerge.2.14.1208\tools' - François
1
4> ILMerge.exe .\packages\WireMock.Net.1.0.4.2\lib\net452\WireMock.Net.dll /keyfile:key.snk /out:WireMock.Net.dll /targetplatform:v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319 /ndebug /lib:.\packages\Newtonsoft.Json.10.0.3\lib\net45\ /lib:.\packages\Handlebars.Net.1.9.0\lib\net40 /lib:.\packages\SimMetrics.Net.1.0.4\lib\net45 /lib:.\packages\Microsoft.Owin.2.0.2\lib\net45 /lib:.\packages\Owin.1.0\lib\net40 /lib:.\packages\Microsoft.Owin.Hosting.2.0.2\lib\net45 /lib:.\packages\MimeKitLite.2.0.1\lib\net45 /lib:.\packages\XPath2.1.0.5.1\lib\net40 /lib:.\packages\RestEase.1.4.4\lib\net45 - François

2

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


2
我添加了NuGet包“StrongNamer”,问题得到了解决。

这是一份礼物 - 非常感谢,因为我在一个有很多参考资料的项目中苦苦寻找。 - Dave Friedel

1

情况:

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

项目A、B、C在X中,项目A、C、D在Y中。

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

如果我编译解决方案X,一切正常(在该解决方案中,我删除了A -> C的引用),但在解决方案Y中,我遇到了这个问题。

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


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

你可以签署他人的文件,也可以签署自己的文件,数量没有限制。

enter image description here


8
这是一种不同类型的签名。 OP问的是如何使用强名称对.NET程序集进行签名,而您展示的是如何使用代码签名证书为可执行文件进行签名。这是两种不同的事情。 - Blue Toque

0

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

Update-Package -reinstall

我的程序集A引用了三个第三方程序集,但只有两个被程序集B引用并包含在引用中。

通过更新包命令添加了缺失的第三方程序集引用,错误得以解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接