组装生成失败-引用程序集没有强名称。为什么其他解决方案不起作用?

13
这是一个经典问题,有许多解决方案描述。然而,它们似乎都不适用于我。
我正在使用Report.NET库在SharePoint解决方案中。将Reports.dll添加为引用并编译会导致错误信息“程序集生成失败 - 引用的程序集'Reports'没有强名称。”然而,我的项目在项目属性中链接了key.snk密钥文件。因此,我尝试按照其他地方描述的步骤对dll进行反汇编、签名和重新组装:
C:\Users\Administrator\Documents\Visual Studio 2010\Projects\MyProj
\dll>ildasm Reports.dll /out:Reports.il

C:\Users\Administrator\Documents\Visual Studio 2010\Projects\MyProj
\dll>ilasm Reports.il /dll /resource=Reports.res /key=..\key.snk

<output removed for brevity>

Class 95
Class 96
Method Implementations (total): 1
Resolving local member refs: 0 -> 0 defs, 0 refs, 0 unresolved
Writing PE file
Signing file with strong name
Operation completed successfully

我最终得到了一个新的Reports.dll文件,时间戳为现在。将其作为引用添加到我的项目中并进行构建,但是仍然收到与之前相同的错误消息。 "Reports" 引用的属性显示 "强名称:False"。
不要因为遇到一点麻烦而气馁,我尝试使用强名称工具重新签名程序集:
C:\Users\Administrator\Documents\Visual Studio 2010\Projects\MyProj
\dll>sn -R Reports.dll ..\key.snk

Microsoft (R) .NET Framework Strong Name Utility  Version 4.0.30319.1
Copyright (c) Microsoft Corporation.  All rights reserved.

Assembly 'Reports.dll' successfully re-signed

值得注意的是,在进行反编译/签名/重新组合之前运行 SN 实用程序会失败,并显示错误信息“Reports.dll 不代表强名称程序集”。
然而,在进行反编译/签名/重新组合后再运行它时,将其重新添加到 Visual Studio 时仍然会出现原始错误消息。

可能是重复的问题:程序集生成失败--引用的程序集'Interop.Office'没有强名称 - JabberwockyDecompiler
2个回答

23

我刚刚使用这种方式在vs 2010中解决了这个问题:

Project Properties -> Signing -> uncheck Sign the assembly checkbox

7
我非常喜欢 Stack Overflow。99% 的问题总是在 Stack Overflow 的帮助下得以解决。你们太棒了! - Karishma

3
我建议,如果你已经在命令行中明确地正确签署了Reports.dll文件,但是VS仍然说该dll未签名,则它必须引用了错误的文件。
如果你想要真正谨慎并在签名后再次检查强名称,请将Reports.dll加载到ildasm中(你必须双击树中的清单节点并向下滚动以找到.publickey部分)。或者为了方便,只需在ILSpy中打开它。
在签署reports.dll之后,将引用项目的proj文件作为XML文档打开(如果你有VS PowerCommands,可以右键单击并“编辑项目文件”;否则,可以卸载项目,然后使用“打开文件”对话框中的“打开方式”命令在VS中打开它),并验证对dll的引用确实是正确的路径。如果不是,请更正它并重新加载项目。

嗨,感谢您的输入。在运行上述签名命令后,ILSpy(顺便说一句,这是一个不错的工具)报告了Reports.dll的[assembly: AssemblyKeyFile("")]和[assembly: AssemblyKeyName("")]。我猜这意味着该文件实际上没有被签名?但是该文件的时间戳仍然对应于所谓的签名。 - Geir Smestad
有趣的是 - 当您在ILSpy中选择程序集的根节点时,右侧窗格应该在前两个注释中显示文件名,然后在第二行显示完整的程序集名称。在第二行上,程序集名称是否以, PublicKeyToken=[some_hex_string]结尾? - Andras Zoltan
1
这是不是 'Report.Net' 库的链接:http://sourceforge.net/projects/report/ 如果是,你可不可以在 VS 中打开该项目,并在构建过程中将你的密钥文件作为其中的一部分重新构建? - Andras Zoltan
程序集名称为“Reports,Version=0.8.1774.35468,Culture=neutral,PublicKeyToken=null”。所以我猜这也表明该程序集实际上没有签名。您已经找到了正确的库,我可以按照您描述的方式构建它。如果我不能很快解决问题,可能最终会这样做,但我一直在签名方面遇到麻烦,想看看是否能够彻底解决它。谢谢。 - Geir Smestad
我注意到Reports.NET是面向.NET 2.0版本的。我的项目则是针对.NET 3.5版本的。这有任何重要意义吗? - Geir Smestad
不,这不应该是一个问题 - 3.5仍然在2.0 CLR上运行。 - Andras Zoltan

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