我在项目中使用了一些未签名的库。因为我的应用程序是强签名的,所以库也一样。
我使用以下方式签署这些库:
"%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资源管理器中的文件属性对话框/详细信息选项卡进行检查。所以我认为这是缺少的清单。
答案 0 :(得分:4)
我想知道为什么会这样。我同样使用ilasm和ildasm对未签名和签名的程序集进行往返编译有很好的经验。您是否可以验证ILasm输出的元数据是否仍包含版本信息(程序集范围的底部):
.assembly ConsoleApplication1
{
//...
.hash algorithm 0x00008004
.ver 1:0:0:0
}
再次检查,它“在我的机器上工作”(使用完全相同的命令行开关)。
实际丢失的是 FileVersion 属性(当您将鼠标悬停在程序集上时,您在Windows资源管理器中看到的属性。 AssemblyVersion 属性仍然存在,正确的。难道你可能会混淆两者吗?只有AssemblyVersion
对于绑定信息很重要。有关详细信息,请参阅此SO post。
希望我能提供帮助,否则你需要提供更多背景信息。
答案 1 :(得分:1)
如果您有源代码,那么只需重新编译具有强名称的库 - 反汇编和重组通常效果很好,但它仍然是一个黑客。
为了保持库之间的依赖关系,您需要更新.il代码中的引用以使用它们引用的程序集的公钥,否则它们将尝试引用程序集的未签名版本,从而失败在运行时加载它。
您可以手动执行此操作,但在2或3个程序集之后会变得非常繁琐。快速修复此问题的是signer,它可以解决您遇到的许多困难,并且做得非常好 - 通常非常快速和干净。
(请注意,目前它是针对旧的.NET版本构建的。如果您使用C#4 / .NET 4程序集,则需要下载源代码,将其更改为目标.NET 4并重建它以获得signer.exe将正确处理.NET 4程序集。)