6

我正在尝试生产一个足够智能的工具,可以通过编程检查由在不同时间在两个单独的机器上编译的相同 C# 代码生成的发布版本二进制文件,并得出结论该代码是相同的,同时能够获取任何代码更改(如果存在)用于生成这些二进制文件的 c# 代码。

我尝试过使用多种方法,但为了保持简短,我将坚持最新的尝试。我在二进制文件上使用 /text 选项运行 ildasm,并在文本中替换匿名字段等的 GUID,但是当二进制文件来自不同的电脑时,我发现 ILDASM /text 选项生成的文本被重新排序。源自相同代码但在不同机器上由相同设置编译的二进制文件也出现了严重的重新排序。任何关于如何控制 IL 重新排序的建议将不胜感激?

干杯

PS:任何可靠地实现这一点的替代策略也是最受欢迎的。

4

2 回答 2

7

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

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

两次编译相同的 C# 程序是否保证产生相同的二进制输出?

不。

于 2012-07-05T07:23:23.963 回答
2

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

于 2012-07-08T23:11:54.933 回答