【问题标题】:How to compute a hash of assembly, so that this hash could be used to tell if the code in the assembly has changed?如何计算程序集的哈希,以便可以使用此哈希来判断程序集中的代码是否已更改?
【发布时间】:2016-09-28 02:52:39
【问题描述】:

问题在于,与之前构建的结果相比,重新构建完全相同的代码会生成不同的程序集。

我为什么需要这个?我有一个 T4 模板,可以从给定的合同程序集中生成某些源代码。该源代码被签入到 VCS,即使它是生成的。这是因为合约组件的更改相对不频繁。但是,当它确实发生变化时,只要不重新评估上述 T4 模板,我希望构建失败。

我的计划是在生成的源文件中植入合约程序集的哈希码,例如:

// 1B-D0-06-48-02-C2-C5-C5-48-37-AA-61-66-6B-6D-01

在构建包含模板的项目时会运行一个 msbuild 任务。该任务将计算合约程序集哈希并将其与生成的源代码中的哈希值进行比较。不等式意味着合约程序集发生了变化,我们需要重新运行模板。

存储程序集版本无济于事 - 在开发过程中也是如此。

另一种解决方案是在运行时将模板评估为临时文件,如果它不同,则将其复制到生成的源文件中 - 不需要散列。

不过,我想引起开发者的注意,合同发生了变化。此时我希望开发人员手动重新评估模板。但仅在需要时。

我想我可以编写一个复杂的代码来反映合约程序集,以创建其类型的某种规范表示。取这个规范表示的哈希应该是它。不过这也不是小事,想看看能不能避免。

【问题讨论】:

  • 正确的做法是为您的程序集提供一个强名称,其中包括加密签名。此功能内置在 .NET 中。例如,请参阅stackoverflow.com/questions/1436879/…。如果您想要一种不同的方法,那么您的问题就太宽泛了,因为有很多不同的方法可以解决。
  • 您可以检查重新编译造成的差异。很可能只是程序集元数据中某处提到的编译时间。
  • @PeterDuniho - 签名不是问题。下一步是什么?

标签: c# reflection hash .net-assembly


【解决方案1】:

我想我可以编写一个复杂的代码来反映合约程序集,以创建其类型的某种规范表示

其实ildasm可以做到这一点。如果使用以下参数调用:

ildasm /text /pubonly _dll_

它将打印到程序集的公共接口的标准输出

【讨论】:

  • 这比比较 DLL 更好。虽然,必须从输出中删除 // Image base:// MVID: 行。所以,它可以被使用。我想知道结果是否可以改进,因为ildasm 为我产生了太多的输出。当然,我只需要签名和自定义属性。例如,不需要方法体。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
  • 2018-01-05
  • 2016-06-10
  • 2011-03-24
  • 2010-11-07
相关资源
最近更新 更多