6

我在项目中使用了一些未签名的库。因为我的应用程序是强签名的,所以库也必须如此。

我使用以下方法签署这些库:

"%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

我在 Reflector 中打开了 DLL,看来至少版本号还在。我一直在使用 Windows 资源管理器中的文件属性对话框/详细信息选项卡进行检查。所以我认为这是缺少的清单。

4

2 回答 2

4

我想知道为什么会这样。同样,我在使用 ilasm 和 ildasm 对未签名和已签名的程序集进行往返编译方面也有很好的经验。您能否验证 ILasm 输出的元数据是否仍包含版本信息(程序集范围的底部):

.assembly ConsoleApplication1
{
  //...
  .hash algorithm 0x00008004
  .ver 1:0:0:0
} 

刚刚再次检查,它“在我的机器上工作”(使用与您完全相同的命令行开关)。

实际上会丢失的是FileVersion属性(当您将鼠标悬停在程序集上时,您在 Windows 资源管理器中看到的那个。AssemblyVersion属性仍然存在且正确。难道您混淆了这两者?只有AssemblyVersion对绑定信息很重要。有关更多信息,请参阅此SO 帖子

希望我能提供帮助,否则您需要提供更多上下文。

于 2010-08-16T21:35:00.507 回答
1

如果您有源代码,那么只需重新编译具有强名称的库 - 反汇编和重新组装通常工作得很好,但它仍然是一个 hack。

要保持库之间的依赖关系正常工作,您需要更新 .il 代码中的引用以使用它们所引用的程序集的公钥,否则它们将尝试引用程序集的未签名版本,因此无法加载它在运行时。

您可以手动完成此操作,但在 2 或 3 次组装后会变得非常乏味。对此的快速解决方法是signer,它为您解决了很多困难,并且做得很好 - 它通常非常快速和干净。

(请注意,目前它是针对旧的 .NET 版本构建的。如果您使用 C# 4/.NET 4 程序集,您需要下载源代码,将其更改为目标 .NET 4 并重建它以获得 signer.exe这将正确处理 .NET 4 程序集)。

于 2010-08-16T22:06:54.887 回答