签署未签名的程序集

时间:2009-11-03 18:12:01

标签: .net horn

最近升级的NHibernate 2.1带来了巨大的头痛情况 到表面。

似乎大多数项目默认构建为已签名的程序集。对于 示例fluentnhibernate引用密钥文件fluent.snk。

Nhibernate.search从我可以收集的内容构建unsigned并且不会构建 签名,如果您引用生成的密钥文件,则会收到错误:

引用程序集“Lucene.Net”没有强名称

这意味着像castle.activerecord这样的项目有nhibernate.search为 当你得到引用的可怕错误时,不会构建依赖项 程序集nhibernate.search没有强名称:

相当多的项目使用caslte.activerecord,所以非常重要 这构建。

有没有人知道该怎么做,因为我完全没有想法?

这是完全的疯狂。

4 个答案:

答案 0 :(得分:16)

  1. 获取所提供程序集的MSIL 在VS.NET命令提示符下,输入以下内容: c:> ildasm providedAssembly.dll /out:providedAssembly.il
  2. 重命名/移动原始装配体 我只是将“.orig”添加到文件名中。
  3. 从MSIL输出和程序集密钥文件创建新程序集 假设您已有一个汇编密钥对文件,请从VS.NET命令提示符处执行以下操作: c:> ilasm providedAssembly.il / dll /key=keypair001.snk
  4. 来源http://www.andrewconnell.com/blog/archive/2004/12/15/772.aspx

答案 1 :(得分:2)

问题是,您无法从强名称程序集中引用非强名称程序集,但您可以执行相反的操作。这就是为什么每个体面的项目都应该签名的原因。

当我遇到这个问题时,我在项目作者(或注册一个问题)上放了一行,上面的评论中有解释,当我等待修复时,我自己编译并签名。

答案 2 :(得分:1)

所有给定的答案都有严重的缺陷 - 如果有多个未签名的程序集相互依赖,它们就不起作用。您必须手动编辑IL文件以将未签名的引用更改为已签名的引用。这肯定是可能的,但容易出错。

有一种更好的方法。首先,这是我的消息来源:

  1. https://www.nuget.org/packages/Nivot.StrongNaming/1.0.4.2
  2. How to download a Nuget package without nuget.exe or Visual Studio extension?
  3. 第一个是指向名为StrongNaming的NuGet包的链接,它允许强烈命名程序集,它还为您处理未签名的引用! 第二部分描述了如何在没有Visual Studio的情况下下载NuGet包。

    我个人使用Visual Studio使用NuGet包管理器本身下载它,但是,您始终可以直接浏览到https://www.nuget.org/api/v2/package/Nivot.StrongNaming/1.0.4.2 并下载nivot.strongnaming.1.0.4.2.zip

    下载的zip(或使用NuGet时的包)中有一个tools文件夹。找到它后,您可以轻松地将其安装为PowerShell模块。

答案 3 :(得分:0)

http://buffered.io/posts/net-fu-signing-an-unsigned-assembly-without-delay-signing发布了详细指南。

总之,程序如下:

  • 使用ildasm
  • 反汇编目标二进制文件
  • 使用ilasm重建/重组,这次使用密钥