12

最近 NHibernate 2.1 的升级使一个令人头疼的问题浮出水面。

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

Nhibernate.search 从我可以收集的内容中构建无符号并且不会构建签名,也就是说,如果您引用生成的密钥文件,您会收到错误:

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

这意味着像 castle.activerecord 这样具有 nhibernate.search 作为依赖项的项目将不会构建,因为您会收到可怕的错误引用程序集 nhibernate.search 没有强名称:

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

有没有人知道在这里做什么,因为我完全没有想法?

这是完全的疯狂。

4

4 回答 4

17
  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

来源http://www.andrewconnell.com/blog/archive/2004/12/15/772.aspx

于 2009-11-04T12:23:47.640 回答
2

问题是,您不能从强名称程序集中引用非强名称程序集,但您可以反过来。这就是为什么每个像样的项目都应该签署的原因。

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

于 2009-11-03T18:35:18.550 回答
1

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

有一个更好的方法。首先,这是我的资料来源:

  1. https://www.nuget.org/packages/Nivot.StrongNaming/1.0.4.2
  2. 如何下载没有 nuget.exe 或 Visual Studio 扩展的 Nuget 包?

第一个是指向名为 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 模块。

于 2014-12-08T21:24:08.827 回答
0

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

总而言之,程序如下:

  • 使用反汇编目标二进制文件ildasm
  • 使用 重建/重新组装ilasm,这次用一个键
于 2012-08-28T09:37:07.287 回答