【发布时间】:2011-04-08 16:50:33
【问题描述】:
我们有一些共享程序集,每晚都会自动生成。如果没有对源代码进行任何更改,我希望程序集二进制文件与以前的版本完全相同。
但是,程序集之间似乎存在细微差别。
我已经做了一些努力来确定两个构建之间的差异。我使用ildasm 生成了一个 il 版本,并比较了生成的文本版本。唯一的区别(在 IL 中)是模块中的 MVID(随机 guid)。
一些谷歌搜索告诉我模块版本 ID 是由编译器生成的,因此可以确定构建源,即使其他一切都相同。
此 MVID 在相同代码的构建之间创建人工差异,并人工签入生成的程序集。
是否可以将 MVID 提供给 C# 编译器?
【问题讨论】:
-
这不是唯一的区别,例如 PE32 标头有一个时间戳。当您决定签入二进制文件时,这个问题才真正开始。
-
@Hans:我同意签入二进制文件不是最佳做法。我问这个问题是因为我想知道为什么构建相同代码的二进制文件之间存在差异。
-
你仍然对我的论点嗤之以鼻。那么如果 MVID 发生变化呢?文件无论如何都会更改。您认为完全相同的源代码应该生成完全相同的二进制文件的假设是不正确的。你不能让它正确,放弃所有希望。
-
@Hans:为什么完全相同的源不能产生相同的二进制文件?
-
在我看来,如果使用相同的编译器、链接器……(包括选项),完全相同的源代码应该会产生相同的二进制文件。时间戳和 MVID(模块版本标识符)使事情变得更加复杂。如果时间戳被删除并且 MVID 将是二进制的 SHA2(假设 MVID 为 00),那会更方便。如果二进制文件 100% 相等,则不需要重新测试。现在,没有办法确定这是否属实。
标签: c# .net assemblies diff binary-reproducibility