小编典典

如何修复“引用的程序集没有强名称”错误

all

我在我的Visual Studio
2005
项目中添加了一个弱命名的程序集(它是强命名的)。我现在收到错误:

“引用的程序集 ‘xxxxxxxx’ 没有强名称”

我需要签署这个第三方程序集吗?


阅读 60

收藏
2022-05-16

共1个答案

小编典典

为避免此错误,您可以:

  • 动态加载程序集,或
  • 签署第三方程序集。

您将在 .NET-fu 中找到有关签署第三方程序集的说明
:签署未签名的程序集(无延迟签名)

签署第三方程序集

签署 thirp-party 的基本原则是

  1. ildasm.exe使用并保存中间语言 (IL)反汇编程序集:

    ildasm /all /out=thirdPartyLib.il thirdPartyLib.dll
    
  2. 重建并签署程序集:

    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
}
2022-05-16