【问题标题】:Assembly generation failed - Referenced assembly does not have a strong name. Why doesn't other solutions work?程序集生成失败 - 引用的程序集没有强名称。为什么其他解决方案不起作用?
【发布时间】:2012-02-22 08:35:04
【问题描述】:

这是一个经典问题,有numerous 解决方案described。但是,它们似乎都不适合我。

我在 SharePoint 解决方案中使用 Report.NET 库。添加 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,时间戳记到现在。但是,将其添加为对我的项目和构建的引用会给出与以前相同的错误消息。 “报告”引用的属性显示“强名称:假”。

不要因为有点麻烦而气馁,我尝试使用强命名实用程序重新签署程序集:

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 时,我仍然会收到原始错误消息。

【问题讨论】:

标签: .net visual-studio-2010 sharepoint code-signing


【解决方案1】:

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

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

【讨论】:

  • 我只是喜欢堆栈溢出。我 99% 的问题总是在堆栈溢出的帮助下得到解决。你们都摇滚!!
【解决方案2】:

我建议,如果在您从命令行明确地对 Reports.dll 进行了正确签名后,VS 仍然说该 dll 未签名;那么它一定是引用了错误的文件。

如果你真的很偏执并在签名后仔细检查强命名,请将 Reports.dll 加载到 ildasm 中(你必须双击树中的清单节点并向下滚动以找到 .publickey 部分)。或者为方便起见,只需在 ILSpy 中打开它。

签署reports.dll后;将引用项目的 proj 文件作为 XML 文档打开(如果您有 VS PowerCommands,则可以右键单击并“编辑项目文件”;否则,您可以卸载项目,然后使用 VS 中的“打开方式”命令将其打开打开文件对话框)并验证对 dll 的引用确实是正确的路径。如果不是,请更正并重新加载项目。

【讨论】:

  • 您好,感谢您的意见。运行上面的签名命令后,ILSpy(顺便说一句,不错的工具)报告 Reports.dll 的 [assembly: AssemblyKeyFile("")] 和 [assembly: AssemblyKeyName("")]。我猜这意味着该文件实际上没有签名?不过,文件的时间戳仍然对应于假定的签名。
  • 不感兴趣 - 当您在 ILSpy 中选择程序集的根节点时,右侧窗格应在前两个 cmets 中显示文件名,然后在第二行显示完整的程序集名称。在第二行,程序集名称是否以 , PublicKeyToken=[some_hex_string] 结尾?
  • 这也是这里的“Report.Net”库:sourceforge.net/projects/report 如果是这样,作为构建过程的一部分,您能否不打开项目并使用密钥文件在 VS 中重建?
  • 程序集名称为“Reports, Version=0.8.1774.35468, Culture=neutral, PublicKeyToken=null”。所以我想这也表明程序集实际上没有签名。您找到了正确的库,我可以按照您描述的方式构建它。如果我不能很快弄清楚,可能最终会这样做,但我总是在签约方面遇到麻烦,想看看我是否能一劳永逸地解决这个问题。谢谢。
  • 我注意到 Reports.NET 是针对 .NET 2.0 版的。我的项目针对.NET 3.5。这有什么意义吗?
猜你喜欢
  • 2015-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-01
  • 1970-01-01
  • 2014-08-23
  • 1970-01-01
相关资源
最近更新 更多