VS程序集生成错误-- 引用的程序集“XX”没有强名称的解决办法
通常,我们尝试编译引用 COM 互操作程序集的托管程序集或者编译没有强名称的任何其他托管程序集时,您可能会收到下面的错误消息:
程序集生成失败 -- 引用程序集“XX.DLL”没有强名称
在官方文档上,产生的原因是这样说的:编译具有强名称的程序集时,任何被引用的程序集也必须具有强名称。
提供的解决方案如下:
要在引用 COM 互操作程序集时解决该问题,请按照下列步骤操作: 注意:要在引用没有强名称的托管程序集时解决该问题,必须重新生成具有强名称的程序集。 Microsoft Visual C# .NET
如果 Visual C# .NET 项目引用 COM 互操作程序集,则在您引用 COM 动态链接库 (DLL) 时将为您生成该 COM 互操作程序集。可以在 Visual C# 项目属性中指定包装程序集密钥文件,如下所示:
1.在 Microsoft Visual Studio .NET 中,打开要在其中引用 COM 组件的 Visual C# 项目的属性。
2.在树中,单击“通用属性”,然后单击“常规”。
3.在“包装程序集密钥文件”字段中,添加密钥文件。
4.重新生成项目。
Microsoft Visual Basic .NET
如果 Visual Basic .NET 项目引用 COM 互操作程序集,则必须使用 Tlbimp.exe 手动生成 COM 互操作程序集,如下所示:
1.在 Microsoft Visual Studio .NET 中,打开要在其中引用 COM 组件的 Visual Basic 项目的属性。
2.删除对 COM 组件的现有引用。
3.在命令提示符处对您的 COM DLL 运行 Tlbimp.exe 以生成具有强名称的互操作程序集,如下所示: tlbimp.exe MyCOMDLL.dll /keyfile:KeyFile.snk /out:MyCOMInterop.dll
4.向您的 Visual Basic .NET 项目中添加对 Tlbimp.exe 输出文件的引用。
5.重新生成项目。 如果该程序集被延迟签名而不是完全签名,则包装程序集也必须被延迟签名。要创建一个被延迟签名的程序集,请使用 TlbImp.exe 工具生成包装。为此,请按照以上步骤操作。如果使用“Microsoft Visual Basic .NET”步骤,请修改步骤 3 中提供的命令行,如下所示: tlbimp.exe MyCOMDLL.dll /delaysign /publickey:PublicKeyFile.snk /out:MyCOMInterop.dll
在某个论坛.net问答中也看似到类似一例,现也摘录于次。
请问“引用的程序集没有强名称”这个错误该怎么解决?
问: 具体的错误提示是这样的: 程序集生成失败 -- 引用的程序集“Microsoft.Web.UI.WebControls”没有强名称 我的类里面包含了一个TreeView控件: protected Microsoft.Web.UI.WebControls.TreeView tvMenu;
答1: 因为TREEVIEW控件源码中申明了必须使用强名程序集,所以缺少了签名文档后,无法编译成功。解决方法是:你找到你机器中的SN。EXE文件,然后运行sn -k test.snk ,这样你就得到了test.snk的签名文档,然后在你的项目属性中,加入test.snk。
答2: 要这样的吗,没用过treeview ,^_^,不过做com+也要用这个的,知道要用,但是不知道为什么要用
答3: 但我的AssemblyInfo文件里面已经这样设置了: [assembly:AssemblyKeyFile(@"***.snk")]
答4: 噢,我知道是怎么回事了。 谢谢
在CN布罗格上有这样的文章,也给出连接以供参阅: 关于程序集生成失败 -- 引用的程序集没有强名称的解决办法 http://www.cnblogs.com/76674718/archive/2010/11/08/1871837.html