我已经为我的Visual Studio 2005项目(强名称)添加了一个弱命名的程序集.我现在收到错误:
"引用汇编'xxxxxxxx'没有强名称"
我是否需要签署此第三方程序集?
要避免此错误,您可以:
动态加载程序集,或
签署第三方程序集.
您将在.NET-fu中找到有关签署第三方程序集的说明:签署未签名的程序集(无延迟签名).
签署罢工党的基本原则是
使用ildasm.exe
并拆除组件并保存中间语言(IL):
ildasm /all /out=thirdPartyLib.il thirdPartyLib.dll
重建并签署程序集:
ilasm /dll /key=myKey.snk thirdPartyLib.il
除非您的第三方程序集(A.dll)引用另一个也必须签名的库(B.dll),否则上述步骤可以正常工作.你可以使用上面的命令反汇编,重建和签署A.dll和B.dll,但是在运行时,加载B.dll会失败,因为A.dll最初构建时引用了无符号版本的B.dll.
解决此问题的方法是修补上面步骤1中生成的IL文件.您需要将B.dll的公钥标记添加到引用中.你通过调用得到这个标记
sn -Tp B.dll
这将给你以下输出:
Microsoft (R) .NET Framework Strong Name Utility Version 4.0.30319.33440 Copyright (c) Microsoft Corporation. All rights reserved. Public key (hash algorithm: sha1): 002400000480000094000000060200000024000052534131000400000100010093d86f6656eed3 b62780466e6ba30fd15d69a3918e4bbd75d3e9ca8baa5641955c86251ce1e5a83857c7f49288eb 4a0093b20aa9c7faae5184770108d9515905ddd82222514921fa81fff2ea565ae0e98cf66d3758 cb8b22c8efd729821518a76427b7ca1c979caa2d78404da3d44592badc194d05bfdd29b9b8120c 78effe92 Public key token is a8a7ed7203d87bc9
最后一行包含公钥令牌.然后,您必须在A.dll的IL中搜索对B.dll的引用,并按如下方式添加令牌:
.assembly extern /*23000003*/ MyAssemblyName { .publickeytoken = (A8 A7 ED 72 03 D8 7B C9 ) .ver 10:0:0:0 }
展开正在使用不具有"强名称密钥"的项目的项目文件,并查找.snk文件(.StrongNameKey).
在Windows资源管理器中浏览到此文件(只是为了让您知道它在哪里).
回到没有"强名称密钥"的项目中的Visual Studio,做
右键单击项目文件
选择属性
选择"签名选项卡"(左侧)
单击"签署程序集"复选框
然后<Browse>到你之前找到的.snk文件
这应该够了吧.这解决了我在同一解决方案中使用另一个项目中的表单的一个项目的问题.
我希望它有所帮助.
我正在寻找解决同样问题的解决方案,并且不勾选"签署程序集"选项对我有用:
(你可能会注意到屏幕截图来自VS2010,但希望它可以帮助某人)
我编写了一个工具来自动强化标记程序集,包括没有源代码的程序集或已经放弃的项目.它以简单的方式使用答案中描述的许多技术,没有现有工具或过时指令的任何缺陷或缺点.
http://brutaldev.com/post/2013/10/18/NET-Assembly-Strong-Name-Signer
希望这有助于任何需要签署第三方程序集的人,而不必跳过篮球去那里.
如果程序集也是未签名的,则可以使用未签名的程序集.
签署第三方程序集对我有用:
http://www.codeproject.com/Tips/341645/Referenced-assembly-does-not-have-a-strong-name
编辑:我已经了解到,如果链接的文章不再有效,发布步骤会很有帮助.所有功劳都归功于Hiren Khirsaria:
运行visual studio命令提示符并转到DLL所在的目录.
For Example my DLL is located in
D:/hiren/Test.dll
现在使用以下命令创建IL文件.
D:/hiren> ildasm /all /out=Test.il Test.dll
(此命令生成代码库)
生成新密钥以签署您的项目.
D:/hiren> sn -k mykey.snk
现在使用ilasm
命令签署您的库.
D:/hiren> ilasm /dll /key=mykey.snk Test.il
打开Visual Studio的开发人员命令提示符.此工具在您的Window程序中可用,可以使用默认的Windows搜索找到.
通过执行以下操作,确保您的提示可以访问以下工具:sn
ildasm
和ilasm
导航到Cool.Library.dll所在的文件夹
sn –k Cool.Library.snk
创建一个新的密钥对
ildasm Cool.Library.dll /out:Cool.Library.il
拆解图书馆
move Cool.Library.dll Cool.Library.unsigned.dll
保持原始库作为备份
ilasm Cool.Library.il /dll /resource=Cool.Library.res /key=Cool.Library.snk
用强名称重新组装库
powershell -command "& {[System.Reflection.AssemblyName]::GetAssemblyName($args).FullName} Cool.Library.dll"
获取程序集完全限定名称.如果必须在web.config或app.config等外部配置文件中引用DLL,则需要此位.
我有一个强烈命名的应用程序然后必须更改它以引用非强名称程序集的问题,所以我在项目属性签名部分取消选中"签署程序集",但它仍然抱怨.我认为它必须是一个造成问题的工件,因为我做了其他正确的事情而且就是这样.我从assemblyInfo.cs文件中找到并删除了行:[assembly:AssemblyKeyFile("yourkeyfilename.snk")].然后没有建立投诉.
我是用nuget安装的ServiceStack dll遇到此问题的。原来,还有另一组标记为已签名的dll可用。并不是每个人都能找到答案,但是您可能只需要检查程序集的现有签名版本即可。