我在Visual Studio 2005项目中添加了一个弱命名的程序集(它是强命名的)。我现在得到的错误:
"引用程序集'xxxxxxxx'没有强名称"
我需要签署这个第三方程序集吗?
我在Visual Studio 2005项目中添加了一个弱命名的程序集(它是强命名的)。我现在得到的错误:
"引用程序集'xxxxxxxx'没有强名称"
我需要签署这个第三方程序集吗?
当前回答
为第三方程序集签名对我来说很有效:
引用程序集没有强名称
我了解到,如果链接的文章不再有效,发布步骤是很有帮助的。所有功劳归于Hiren Khirsaria:
运行Visual Studio命令提示符并转到DLL所在的目录。 例如,我的DLL位于D:/hiren/Test.dll 现在使用下面的命令创建CIL文件。 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
其他回答
I had this issue for an app that was strongly named then had to change it in order to reference a non-strongly named assembly, so I unchecked 'Sign the assembly' in the project properties Signing section but it still complained. I figured it had to be an artifact somewhere causing the problem since I did everything else correctly and it was just that. I found and removed the line: [assembly: AssemblyKeyFile("yourkeyfilename.snk")] from its assemblyInfo.cs file. Then no build complaints after that.
情境: 你有方案A B C D在方案X Y中
X中的A、B、C项目 项目A, C, D在Y
我需要在项目A中使用项目C,但后来我不用了。在bin Debug项目A中有C.dll。
如果我编译解决方案X,一切都很好(在这个解决方案中,我删除参考A -> c),但在解决方案Y中,我得到了这个问题。
解决方案是删除项目A中的C.dll bin Debug
我正在寻找解决同样问题的解决方案,取消“签署程序集”选项对我有用:
(正如你可能注意到的,截图来自Visual Studio 2010,但希望它能帮助到一些人。)
为了避免这个错误,你可以:
动态加载程序集,或者 对第三方程序集进行签名。
你可以在. 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的unsigned版本构建的。
解决这个问题的方法是对上面步骤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
}
首先,确保解决方案中所有项目的所有NuGet包都是相同的版本。例如,您不希望一个项目引用NLog 4.0.0.0,而另一个项目引用NLog 4.1.0.0。然后尝试重新安装NuGet包
Update-Package -reinstall
我的程序集A引用了三个第三方程序集,而我的程序集B也引用了A,其中只有两个被包括在引用中。
缺少对第三方程序集的引用是由update package命令添加的,错误消失了。