为什么 C# 为相同的源代码生成不同的 EXE?

问题描述 投票:0回答:6

每次重新编译 C# 应用程序时,我们都会得到具有不同 MD5 签名的 EXE。我们在同一台机器上重新编译,间隔几分钟。为什么相同的源代码不会产生相同的输出?有办法解决这个问题吗?

c# hash binary-reproducibility
6个回答
18
投票

“所以每个集会都有:

  1. 一个时间戳,位于两个位置
  2. 与 PDB 匹配的 GUID
  3. 每次编译都会生成一个完全随机的 GUID。
  4. 指示程序集构建的计数器 - 仅在后续 Visual Studio 构建中生成。”

来自:

http://ritter.vg/#code_adventures_clr1


4
投票

我认为关键可能是“相隔几分钟”。如果 EXE 中有时间戳,那么就会改变 MD5 签名。


2
投票

我之前必须剖析这些案例,它似乎只是日期时间戳类型的更改(这是一个猜测)。 如果将两个程序集放在 diff 工具下,您将看到 PE 中只有极少数行发生了变化;如果您更改少量代码并比较程序集,您将看到更大的差异。

这是我在研究识别“真正”差异与表面差异的工具时提出的一个问题:

.NET 汇编差异/比较工具 - 有什么可用?


2
投票

程序集的版本号中很可能有几个 *。 这会导致程序集版本号在构建时自动递增,这将导致输出的程序集出现明显差异。 因此,MD5 校验和不同。

尝试将版本号切换为常量程序集版本,看看是否可以解决问题。


2
投票

您可以尝试在两个 .exe 上运行 ildasm.exe(我的路径是

C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin
)。

然后转储标题的原始视图,并将它们与差异工具进行比较。如果仍然没有差异,则可能是 PE 标头需要更高级的工具来发现。 Ildasm 为您提供 PE 标头大小和其他统计信息。


0
投票

将会有一个内置版本号,该版本号会随着每次构建而改变。

© www.soinside.com 2019 - 2024. All rights reserved.