为啥在尝试添加引用时会看到“无法发出程序集:引用的程序集...没有强名称”?

Posted

技术标签:

【中文标题】为啥在尝试添加引用时会看到“无法发出程序集:引用的程序集...没有强名称”?【英文标题】:Why would I see "Unable to emit assembly: Referenced assembly ... does not have a strong name" when trying to add a reference?为什么在尝试添加引用时会看到“无法发出程序集:引用的程序集...没有强名称”? 【发布时间】:2011-06-01 18:00:48 【问题描述】:

我想在我的 WPF 项目中包含一个系统托盘图标,并找到了这个资源:

http://www.hardcodet.net/projects/wpf-notifyicon

看起来它可以很好地工作,但它是为 C# 编写的,我在这个项目中使用 VB.net。我下载了他的项目并将 notifyicon 构建为 DLL,然后添加为对我的项目的引用。

它抛出一个错误:

无法发出程序集:引用的程序集“Hardcodet.Wpf.TaskbarNotification”没有强名称

所以我正在尝试找出最好的方法。我需要对其进行强命名,还是有更好的方法来做到这一点?

【问题讨论】:

【参考方案1】:

这是一个安全约束。简而言之,如果您对程序集进行强命名,则您向程序集的使用者提供了保证,即只有您的程序集及其依赖项将在运行时加载。恶意方将无法用冒名顶替者替换您的程序集(当然,除非他们有您的密钥)。

如果您的强名称程序集引用了弱名称程序集,则无法满足该保证,因为它的依赖项可能会被冒名顶替者替换。这就是您收到编译错误的原因。

您的选择是:

    从程序集中删除强名称。 在编译时强命名第三方代码。在您的情况下,这很容易,因为您是从源代码构建的。 使用ILMerge 强烈命名第三方二进制文件。如果您不是从源代码构建并且第三方忽略签署他们的程序集,这是一个有吸引力的选择。

【讨论】:

【参考方案2】:

您需要为其他程序集添加一个强名称,或者让您的项目不包含强名称。

由于您已经在构建它,您只需在项目属性中添加一个强名称,然后重新构建。一旦你这样做了,它应该可以工作(根本不改变代码)。

【讨论】:

他的意思是你必须签字。【参考方案3】:

简单来说,这意味着您有一个名为 AssemblyA 的项目,它引用了 AssemblyB。 AssemblyA 已签名,AssemblyB 未签名。

您必须决定是否也签署 AssemblyB,或者不签署 AssemblyA。

【讨论】:

以上是关于为啥在尝试添加引用时会看到“无法发出程序集:引用的程序集...没有强名称”?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在设置 CIAdditionCompositing 过滤器时会看到 NSUnknownKeyException?

为啥在修改引用的程序集时会重建其他程序集?

为啥 Web 部件在第一次添加到页面时会在构造函数上失败?

为啥在传递引用的参数时会得到“/bin/sh:参数列表太长”?

为啥将图例添加到绘图时会出现错误?

为啥我在 subView 中添加一些约束时会出错?