【问题标题】:Does building two exact matching C# projects on different computers always generate the same executable?在不同的计算机上构建两个完全匹配的 C# 项目是否总是生成相同的可执行文件?
【发布时间】:2014-05-25 21:43:24
【问题描述】:

这是假设两台计算机都将完全相同的 C# .NET 项目从一台计算机复制到另一台计算机。当您在两台计算机上构建项目时,可执行文件是否完全相同?如果不是,有什么区别?

我问的原因是源代码可以被验证为与可执行文件匹配。这是为了向愿意自己构建程序的用户保证这是完全匹配的。

【问题讨论】:

  • 如果一个编译器有另一个编译器没有的补丁怎么办?或者如果一个人有不同版本的库?
  • 好的,这是假设编译器和补丁也是一样的。
  • 不,事实上它保证即使在同一台机器上也不会产生相同的文件。见this。有一些方法可以尝试处理这个问题(参见here),但能够比较它们并不是为场景设计的。
  • 如果您考虑二进制比较,即使在同一台机器上连续两次构建也不会因为构建时间而有所不同,我会感到惊讶。如果 .NET 程序集不同,则会出现其他差异。我认为您应该选择版本号。

标签: c# build project executable


【解决方案1】:

quote Eric Lippert

没有。

嗯,这是一个很容易写的博客。

构建时包含一个称为“Mvid”的 GUID,以确保每个构建都不同。此外,C# 编译器保证每次运行时都会编写相同的指令。但在实践中,在足够相似的环境中(对于“相似”的某些定义),我希望它会。

您可以将此告知您的用户,并允许他们检查差异。如果唯一的区别在于 Mvid,那么它们就完成了。如果还有其他更改,那么他们需要检查 IL 代码的功能以确保它与您的相同。 (这可以通过像ILSpy 这样的反编译器来简化)

如果他们这么偏执,最好的选择可能就是每次都从源代码自己构建,并使用他们自己的构建。但我确实理解能够审计它的用处,例如你想知道官方的 TrueCrypt 或比特币客户端是合法的。

【讨论】:

  • 使用签名的二进制文件是防止恶意代码从可靠来源被编辑到已编译的二进制文件中的适当工具,而不是反编译和检查 IL。
  • @Servy 你是对的,但我认为这不是这个问题的重点。相反,它是在确认源代码的可信度:他的二进制文件与他的源代码匹配。
  • 好吧,反编译的版本肯定会和源代码有很大的出入,如果他们要费力将反编译的版本与源代码进行手动比较,他们还不如在反编译的源代码中寻找恶意内容,完全跳过实际的源代码。
  • 谢谢。最后一段是我来自的地方。我的应用程序被设计成高度安全的......它将是开源的,有点像 TrueCrypt/Bitcoin。
  • 我想在这个答案中补充一点,我们遇到了一个问题,即我们的程序无法识别希伯来语字符并将此类文本显示为乱码。这似乎完全是随机的,我们无法弄清楚何时发生,何时没有。最终发现,其中一位程序员的系统区域设置与其他程序员不同,并且在他的计算机上构建是罪魁祸首。
猜你喜欢
  • 2015-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多