Answers:
为避免此错误,您可以:
您将在.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
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,则需要此位。删除“登录大会”复选标记下的“签名”标签作品@Michal Stefanow说。
在此处添加是对自己的文件和/或其他人的文件进行签名的最简单方法。您只需要在“构建后事件命令行”下添加此行:
"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)"
您可以签名其他人的文件或自己的文件,并且可以根据需要签名。
旧问题,但令我惊讶的是,没有人提到ilmerge。ilmerge来自Microsoft,但不随VS或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(从VS)生成自己的密钥文件:
sn -k key.snk
1> Register-PackageSource -ProviderName NuGet -Name NuGet -Location http://www.nuget.org/api/v2
2> Install-Package -Name ILMerge
3> $env:path += ';C:\Program Files\PackageManagement\NuGet\Packages\ilmerge.2.14.1208\tools'
4> ILMerge.exe .\packages\WireMock.Net.1.0.4.2\lib\net452\WireMock.Net.dll /keyfile:key.snk /out:WireMock.Net.dll /targetplatform:v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319 /ndebug /lib:.\packages\Newtonsoft.Json.10.0.3\lib\net45\ /lib:.\packages\Handlebars.Net.1.9.0\lib\net40 /lib:.\packages\SimMetrics.Net.1.0.4\lib\net45 /lib:.\packages\Microsoft.Owin.2.0.2\lib\net45 /lib:.\packages\Owin.1.0\lib\net40 /lib:.\packages\Microsoft.Owin.Hosting.2.0.2\lib\net45 /lib:.\packages\MimeKitLite.2.0.1\lib\net45 /lib:.\packages\XPath2.1.0.5.1\lib\net40 /lib:.\packages\RestEase.1.4.4\lib\net45