在不同的机器上使用相同的C#源代码实现可重复构建

6
我正在尝试开发一个工具,能够智能地编程性地检查在不同时间在两台不同机器上编译出的相同C#代码版本的发布版本二进制文件,并得出结论:这些代码是相同的,同时如果存在任何代码更改,也能够捕获到。我尝试了许多方法,但为了简洁起见,我只会介绍最新的尝试。我使用ILDASM并在二进制文件上运行/text选项,在文本中替换匿名字段等GUID,但当二进制文件来自不同的计算机时,我发现ILDASM /text选项生成的文本被重新排序。由相同代码但在不同机器上编译的二进制文件也出现了大量的重新排序。有什么建议可以控制IL的重新排序吗?谢谢!PS:任何可靠完成此操作的其他策略也非常欢迎。

1
你为什么不能比较源代码呢?... - Alastair Pitts
此外,这可能是相关的:https://dev59.com/_3M_5IYBdhLWcg3wiDuA - Alastair Pitts
1
如果可能的话,你能告诉我为什么需要这样一个工具吗?也许有更好的解决方案来解决你试图创建它的问题。 - Nikola Anusev
5
当编译器团队的主要开发人员发言时,你应该认真倾听:http://blogs.msdn.com/b/ericlippert/archive/2012/05/31/past-performance-is-no-guarantee-of-future-results.aspx - Mike Zboray
1
@Hardy msbuild 有一个命令行参数 maxcpucount 可以用于此。 - Mike Zboray
显示剩余4条评论
2个回答

7

等待Eric Lippert醒来 :) - 社区维基源自@mikez的评论:

当编译器团队的主要开发人员(Eric Lippert)发言时,您应该听取他的意见:http://ericlippert.com/2012/05/31/past-performance-is-no-guarantee-of-future-results/ 包含了详细的解释和强烈建议不这样做(可能是对这个问题的精确回答):

编译相同的C#程序两次能保证生成相同的二进制输出吗?

不。


截至2016年2月(Roslyn编译器),这种情况不再成立:有一个“确定性”选项可用于此类场景。 由于我在访问微软文档页面之前来到这里,因此应该更新此内容。 - Michel de Becdelièvre

2
我发现根据Eric Lippert在他的帖子中提到的解决方案,可以通过将编译过程的处理器亲和性设置为01来实现。之后生成的可执行文件/ dll几乎与使用的某些mvid和guids相同,除了例外。在这些二进制文件上以文本模式运行ILDASM并构建一个简单的哈希工具以去除这些随机内容即可提供此解决方案。我只是为了完整性和帮助可能遇到此问题的其他人而提供此信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接