为什么C#针对相同的源代码生成不同的可执行文件?

13
每次重新编译我们的C#应用程序后,我们得到的EXE文件都具有不同的MD5签名。我们是在同一台机器上、仅几分钟之间进行重新编译的。为什么相同的源代码不能产生相同的输出?有没有办法解决这个问题?

我猜你已经做了,但是... 你用 IL DASM 检查过清单文件了吗? - yeyeyerman
6个回答

18

"因此,每个程序集都有:

  1. 在两个位置上的时间戳
  2. 与PDB相匹配的GUID
  3. 似乎是每次编译生成的完全随机的GUID。
  4. 仅在后续Visual Studio构建中才会生成计数器,表示程序集的构建次数。"

来源:

http://ritter.vg/#code_adventures_clr1

"


4

我认为关键在于“相隔几分钟”。如果EXE文件中有时间戳,那么这将改变MD5签名。


我从未检查过C#编译器生成的EXE文件,而且已经一年多没有接触C#了。但这可以很好地解释一切,而且很有道理。 - Thomas Owens

2
我以前曾经解析过这些案例,看起来只是DateTime-stamp类型的更改(这只是猜测)。如果您将两个程序集放在不同的工具下进行比较,您会发现PE中只有很少的几行代码发生了变化;如果您改变了一小部分代码并比较程序集,则会看到明显更大的差异。
在我研究识别“真正”差异和表面差异的工具时,我提出了以下问题:
.NET程序集Diff / Compare工具 - 有哪些可用的工具?
链接:https://dev59.com/OXM_5IYBdhLWcg3wq1GF

2

很可能您在程序集版本号中有几个星号(*)。这会导致在构建时自动递增程序集版本号,从而导致输出的程序集出现可见差异。因此,MD5校验和也会不同。

尝试将版本号切换为固定的程序集版本,看看是否可以解决该问题。


2
你可以尝试在两个.exe文件上运行ildasm.exe(我的路径为C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin)。然后转储出头部的原始视图,并使用diff工具进行比较。如果仍然没有区别,那么可能是PE头部,需要更高级的工具来发现。不过,Ildasm会给你提供PE头部大小和其他统计信息。

我强烈建议使用/source和/out标志。 - Denise Skidmore

0

将会有一个内置的版本号,每次构建都会更改。


2
即使程序集版本静态设置为类似于“1.0.0.0”的内容,也是如此吗?只有在将其定义为“1.0.0.*”或手动更改时,构建版本才应更改,对吗? - STW

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接