在保留其组装元数据时,我如何强烈签署外部DLL?
-
29-09-2019 - |
题
我在项目中使用了一些库,这些图书馆未签名。由于我的应用程序已得到强烈签名,因此库也必须是。
我使用:
"%PROGRAMFILES%\Microsoft SDKs\Windows\v7.1\Bin\ildasm.exe" /nobar /all /out=library.il library.dll
"%WINDIR%\Microsoft.NET\Framework64\v4.0.30319\ilasm.exe" /dll /key=MyKey.snk library.il
问题在于,任何元数据(例如版本号)都会在现在签名的DLL中迷失。这是一个问题,因为现在库之间的某些依赖性被打破了。如何保留版本号而不诉诸实际编译这些库的源代码?
更新
实际上,这是一个特定的DLL,它显示了这个问题,我发现它是使用ilmerge构建的。也许这引起了问题。请注意:只有在拆卸和重新组装它之后,由Ilmerge产生的DLL确实具有适当的元数据,元数据消失了。
更新2
我打开了反射器中的DLL,看来至少版本编号仍然存在。我一直在使用Windows Explorer中的“文件属性”对话框/详细信息选项卡进行检查。因此,我认为这是缺少的清单。
解决方案
我想知道为什么会发生这种情况。我在未签名和签名的组件上使用Ilasm和Ildasm在往返编译方面具有相当良好的经验。您可以通过ILASM验证元数据输出仍然包含版本信息(汇编范围的底部):
.assembly ConsoleApplication1
{
//...
.hash algorithm 0x00008004
.ver 1:0:0:0
}
再次检查,它“在我的机器上工作”(使用与您完全相同的命令行交换机)。
实际丢失的是 fileversion 属性(悬停在汇编时,您在Windows Explorer中看到的属性。 装配体 属性是 仍然存在并正确. 。难道你让两者感到困惑吗?只有 AssemblyVersion
对于绑定信息很重要。看到这个 所以发帖 有关更多信息。
希望我能提供帮助,否则您需要提供更多背景。
其他提示
如果您有源代码,那么只需用强名称重新编译库 - 拆卸和重新组装通常效果很好,但这仍然是一个黑客。
为了保持工作库之间的依赖关系,您需要更新.il代码中的引用以使用他们引用的汇编的公共密钥,否则他们将尝试引用汇编的无符号版本,因此未能加载它在运行时。
您可以手动执行此操作,但是在2或3个组件之后变得非常乏味。一个快速解决的问题是 签名者, ,这处理了您涉及的许多困难,并且做得很好 - 通常很快清洁。
(请注意,目前它是针对旧的.NET版本构建的。如果使用C#4/.NET 4组件,则需要下载源,将其更改为Target .NET 4并重建它以获取signer.exe.exe那将正确处理.NET 4组件)。