我怎么知道"组装"是否确实改变了?

Ian*_*Ian 7 c# comparison file-comparison

我在VS2005中创建了一个简单的"Hello World"应用程序.这是一个直接的控制台应用程序; 它只包含以下几行:

Console.WriteLine("Hello World");
Console.ReadLine();
Run Code Online (Sandbox Code Playgroud)

当我尝试重建相同的控制台应用程序而不执行任何更改(只需按下重建按钮)时,我得到一个微妙的不同的可执行文件.(我从第一个和第二个生成的可执行文件生成了一个SHA-1哈希,它是不同的!)

当没有代码更改时,为什么它会有所不同?实际改变了什么?我使用十六进制编辑器进行比较,只看到几个不同的字节.

我想我的最终问题是,我怎么知道"集会"是否确实改变了?(当然不看文件版本,文件大小等)

编辑

到目前为止,我们已经确定差异在于PE头(时间戳和一些调试数据).在我重新发明轮子之前,是否有一个忽略PE头的"装配比较"工具?

谢谢,伊恩

Rup*_*Rup 6

差异将是

  • PE头中的时间戳
  • 调试数据的GUID(如果存在)

(根据您发布的其他输出,可能还有更多内容?)要查看这些内容,请dumpbin /all /rawdata:none在VS命令提示符下运行这两个程序集.

要正确地执行此操作,您必须编写一个理解这一点并忽略这些字节的比较工具 - 或者获取可执行文件的副本,清除时间戳和GUID,然后比较这些版本.或者,在紧要关头,你可以使用像fc /bcontrolfreak建议的东西,并假设如果<20字节不同(时间戳为4,GUID为16),那么它可能是相同的.

您可能会使用已清除时间戳的程序集逃脱--AFAIK它仅用于缓存其他DLL中的导出符号偏移量,如果您将其挂起 - 但它可能更安全地保留原样.如果你真的需要二进制相同的程序集,我建议你改变你的进程,这样你就不会进行清理构建,除非你确实需要它.