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

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

引用程序集“xxxxxxxx”没有强名称;

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

300159 次浏览

为了避免这个错误,你可以:

  • 动态加载程序集,或者
  • 对第三方程序集进行签名。

你可以在。NET-fu:签署一个未签名程序集(无延迟签名)中找到关于为第三方程序集签名的说明。

签署第三方程序集

签署第三方协议的基本原则是

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

    ildasm /all /out=thirdPartyLib.il thirdPartyLib.dll
    
  2. Rebuild and sign the assembly:

    ilasm /dll /key=myKey.snk thirdPartyLib.il
    

Fixing Additional References

The above steps work fine unless your third-party assembly (A.dll) references another library (B.dll) which also has to be signed. You can disassemble, rebuild and sign both A.dll and B.dll using the commands above, but at runtime, loading of B.dll will fail because A.dll was originally built with a reference to the unsigned version of B.dll.

The fix to this issue is to patch the IL file generated in step 1 above. You will need to add the public key token of B.dll to the reference. You get this token by calling

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文件

这样应该可以了。这为我解决了一个问题,在同一个解决方案中,在另一个项目中使用一个表单。

我希望这能有所帮助。

我有这个问题,一个应用程序是强命名的,然后必须改变它,以引用一个非强命名的程序集,所以我在项目属性签名部分取消了“签名程序集”,但它仍然抱怨。我想这一定是一个藏物的地方导致的问题,因为我做的其他一切都是正确的,它只是。我发现并删除了一行:[assembly: AssemblyKeyFile("yourkeyfilename.snk")]从它的assemblyInfo.cs文件。

我已经编写了一个工具来自动强名称标记程序集,包括您没有源代码的程序集或已放弃的项目。它以一种简单的方式使用了答案中描述的许多技术,没有任何现有工具或过时说明的缺陷或缺陷。

。NET程序集强- name签名者

我希望这可以帮助任何需要签署第三方程序集的人,而不必经过重重困难才能到达那里。

我当时正在寻找一个解决同样问题的办法,然后取消了“在大会上签字”的选项。选项适合我:

Enter image description here

(正如你可能注意到的,截图来自Visual Studio 2010,但希望它能帮助到一些人。)

为第三方程序集签名对我来说很有效:

引用的程序集没有强名称

我了解到,如果链接的文章不再有效,发布步骤是很有帮助的。所有功劳归于Hiren Khirsaria:

  1. 运行Visual Studio命令提示符并进入DLL所在的目录。

    For example, my DLL is located in D:/hiren/Test.dll

  2. 现在使用下面的命令创建CIL文件。

    D:/hiren> ildasm /all /out=Test.il Test.dll (此命令生成代码库)

  3. 生成一个新的密钥来签署你的项目。

    D:/hiren> sn -k mykey.snk

  4. 现在使用ilasm命令对库进行签名。

    D:/hiren> ilasm /dll /key=mykey.snk Test.il

正如@Michal Stefanow所说,删除“签署”选项卡下的“签署程序集”复选标记。

Add here是为自己的文件和/或其他人的文件签名的最简单方法。你只需要在“Post-build event命令行”下添加这一行:

"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin\signtool.exe" sign /f "$(ProjectDir)\YourPfxFileNameHere.pfx" /p YourPfxFilePasswordHere /d "Your software title here" /du http://www.yourWebsiteHere.com /t http://timestamp.verisign.com/scripts/timstamp.dll /v "$(BaseOutputPath)$(TargetFileName)"

你可以给别人的文件签名,也可以给自己的文件签名,想签多少都行。

enter image description here

< a href = " http://devillers。nl/strong-naming-third-party-assemblies/" rel="noreferrer">如何为未签名的第三方程序集签名 . nl/strong-naming-third-party-assemblies/" rel="noreferrer">如何为未签名的第三方程序集签名

  1. 打开Visual Studio的开发者命令提示符。该工具可在您的Windows程序中使用,可以使用默认的Windows搜索找到。
  2. 通过执行一次sn ildasmilasm,确保您的提示符可以访问以下工具
  3. 导航到Cool.Library.dll所在的文件夹
  4. sn –k Cool.Library.snk来创建一个新的密钥对
  5. ildasm Cool.Library.dll /out:Cool.Library.il来分解库
  6. move Cool.Library.dll Cool.Library.unsigned.dll来保留原始库作为备份
  7. ilasm Cool.Library.il /dll /resource=Cool.Library.res /key=Cool.Library.snk来重新组装具有强名称的库
  8. powershell -command "& {[System.Reflection.AssemblyName]::GetAssemblyName($args).FullName} Cool.Library.dll"获取程序集完全限定名。如果您必须在外部配置文件(如web)中引用DLL,则将需要此位。Config或app.config。

对我来说,我的问题是我有两个相同的NuGet包安装了不同的版本。

我在使用NuGet安装的ServiceStack DLL文件时遇到了这个问题。原来还有另一组标记为已签名的DLL文件可用。这不是每个人的答案,但您可能只需要检查程序集的现有签名版本。

ServiceStack。签署 < / >

ilmerge使用。ilmerge来自微软,但它没有随Visual Studio或sdk一起发布。不过你可以从在这里下载它。还有一个GitHub存储库。你也可以从NuGet安装:

PM> Install-Package ilmerge

使用方法:

ilmerge assembly.dll /keyfile:key.snk /out:assembly.dll /targetplatform:v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319 /ndebug

如果需要,你可以使用sn(从Visual Studio)生成你自己的密钥文件:

sn -k key.snk
< p >情况: 你有项目A,B,C,D在解决方案X,Y

项目A, B, C在X 项目A, C, D在Y

我需要在项目A中使用项目C,但后来我不用了。在bin Debug项目A中有C.dll。

如果我编译解决方案X,一切都很好(在这个解决方案中,我删除参考A -> c),但在解决方案Y中,我得到了这个问题。

解决方案是删除项目A中的C.dll bin Debug

首先,确保解决方案中所有项目的所有NuGet包都是相同的版本。例如,您不希望一个项目引用NLog 4.0.0.0,而另一个项目引用NLog 4.1.0.0。然后尝试重新安装NuGet包

Update-Package -reinstall

我的程序集A引用了三个第三方程序集,而我的程序集B也引用了A,其中只有两个被包括在引用中。

缺少对第三方程序集的引用是由update package命令添加的,错误消失了。

对我来说,问题在于没有强名称的NuGet包。解决方案是从NuGet安装StrongNamer,它会自动向所有引用的程序集添加强名称。只是简单地在项目中引用它修正了我的问题。

我添加了NuGet包“StrongNamer”,我的问题解决了。