每次我们重新编译我们的 C# 应用程序时,我们都会得到具有不同 MD5 签名的 EXE。我们在同一台机器上重新编译,相隔几分钟。为什么相同的源代码不会产生相同的输出?有没有办法解决这个问题?
问问题
2303 次
6 回答
18
“所以每个集会都有:
- 时间戳,在两个位置
- 与 PDB 匹配的 GUID
- 每次编译都会生成一个完全随机的 GUID。
- 指示程序集的构建是什么的计数器 - 仅在后续 Visual Studio 构建中生成。”
从:
于 2009-08-26T15:25:34.917 回答
4
我认为关键可能是“相隔几分钟”。如果 EXE 中有时间戳,那么这将改变 MD5 签名。
于 2009-08-26T15:12:30.900 回答
2
我之前不得不剖析这些案例,它似乎只是 DateTime-stamp 类型的变化(这是一个猜测)。如果您将这两个程序集放在差异工具下,您将看到 PE 中只有极少数的行发生了变化;如果您更改少量代码并比较程序集,您会发现差异很大。
这是我在研究用于识别与表面差异的“真正”差异的工具时提出的一个问题:
于 2009-08-26T15:10:27.583 回答
2
您很可能在程序集的版本号中有几个 *。这会导致程序集版本号在构建时自动递增,这将导致输出程序集出现明显差异。因此不同的 MD5 校验和。
尝试将版本号切换为常量汇编版本,看看是否能解决问题。
于 2009-08-26T15:21:43.253 回答
2
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin
您可以尝试在两个 .exe 上运行 ildasm.exe(我的路径是)。
然后转储出标题的原始视图,并与差异工具进行比较。如果仍然没有区别,那么可能是 PE 标头需要更高级的工具来发现。Ildasm 为您提供 PE 标头大小和其他统计信息。
于 2009-08-26T15:30:30.443 回答
0
将有一个内置版本号,每次构建都会更改。
于 2009-08-26T15:10:41.153 回答