我在项目中使用了一些库,这些图书馆未签名。由于我的应用程序已得到强烈签名,因此库也必须是。

我使用:

"%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组件)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top