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

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

“所以每个集会都有:

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

从:

http://ritter.vg/#code_adventures_clr1

我认为关键可能是“分开”。 如果EXE中有时间戳,则会改变MD5签名。

我之前不得不剖析这些案例,它似乎只是DateTime-stamp类型的变化(这是猜测)。 如果将两个组件放在diff工具下,您将看到PE中只有极少数行已更改; 如果您更改甚至少量代码并比较程序集,您将看到更大的差异。

这是我在研究工具时打开的一个问题,用于识别与表面上的“真实”差异:

.NET程序集差异/比较工具 – 有什么可用的?

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

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

您可以尝试在两个.exes上运行ildasm.exe(我的路径是C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin )。

然后转出标题的原始视图,并将它们与diff工具进行比较。 如果仍然没有区别,那么可能需要更高级工具才能发现的PE标头。 Ildasm为您提供了PE头大小和其他统计信息。

将有一个内置版本号,将随每个版本而改变。