我已将一个弱名称程序集添加到我的Visual Studio 2005项目中(该项目是强名称的)。 现在出现以下错误:
"引用的程序集 'xxxxxxxx' 没有强名称"
我需要对这个第三方程序集签名吗?
我已将一个弱名称程序集添加到我的Visual Studio 2005项目中(该项目是强名称的)。 现在出现以下错误:
"引用的程序集 'xxxxxxxx' 没有强名称"
我需要对这个第三方程序集签名吗?
有关签署第三方程序集的说明,请参见 .NET-fu:签署未签名程序集(无延迟签名)。
签署第三方程序集的基本原则是
Disassemble the assembly using ildasm.exe
and save the intermediate language (IL):
ildasm /all /out=thirdPartyLib.il thirdPartyLib.dll
Rebuild and sign the assembly:
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
.assembly extern /*23000003*/ MyAssemblyName
{
.publickeytoken = (A8 A7 ED 72 03 D8 7B C9 )
.ver 10:0:0:0
}
ilasm /dll /key=myKey.snk thirdPartyLib.il /res=thirdPartyLib.res
- Cyclion展开使用未“拥有强名称密钥”的项目的项目文件,并查找.snk文件(.StrongNameKey)。
在Windows资源管理器中浏览到该文件(以便知道它在哪里)。
回到Visual Studio,在不“拥有强名称密钥”的项目中执行以下操作:
<Browse>
到先前找到的.snk
文件这样就完成了。这为我解决了一个问题,即在同一解决方案中使用另一个项目中的表单时出现的问题。
希望这能帮助你。
我也曾遇到同样的问题,将“签署程序集”选项取消勾选对我有用:
(你可能注意到,屏幕截图来自Visual Studio 2010,但希望它能帮助某人。)
我编写了一个工具,用于自动为程序集签名,包括那些你没有源代码或已被弃用的项目。它以一种简单的方式使用许多答案中描述的技术,没有任何现有工具或过时指令的缺陷或不足。
.NET Assembly Strong-Name Signer
我希望这可以帮助需要为第三方程序集签名而无需跳过障碍的人们。
如果您的程序集也没有签名,您可以使用未签名的程序集。
我签署了第三方程序集,这对我有用:
我学到了如果链接的文章不再有效,发布步骤是很有帮助的。所有功劳归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
sn
ildasm
和ilasm
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,则需要此部分。对我而言,问题出在一个没有强名称的 NuGet 包上。解决方法是从 NuGet 安装 StrongNamer,它会自动为所有被引用的程序集添加强名称。只需要在项目中引用它即可修复我的问题。
我曾经遇到这样的问题,一个应用程序被强命名了,但为了引用一个非强命名的程序集,必须更改它,因此我在项目属性签名部分取消了“签名程序集”的勾选,但是仍然出现了错误。我认为这可能是某个地方的残留物导致了问题,因为我已经正确地完成了其他所有步骤。我在其assemblyInfo.cs文件中找到并删除了以下行:[assembly: AssemblyKeyFile("yourkeyfilename.snk")]。之后就没有再出现编译错误。