我在 VS2005 中创建了一个简单的“Hello World”应用程序。这是一个简单的控制台应用程序;它只包含以下几行:
Console.WriteLine("Hello World");
Console.ReadLine();
当我尝试在不执行任何更改的情况下重建相同的控制台应用程序(只需按重建按钮)时,我得到了一个略有不同的可执行文件。 (我从第一个和第二个生成的可执行文件生成了 SHA-1 哈希,它是不同的!)
为什么在没有更改代码的情况下会有所不同?到底改变了什么?我使用十六进制编辑器进行比较,只看到几个不同的字节。
我想我的最终问题是,我怎么知道“程序集”是否真的发生了变化? (当然不考虑文件版本、文件大小等)
EDIT
到目前为止,我们已经确定差异在于 PE 标头(时间戳和一些调试数据)。在我重新发明轮子之前,是否有一个忽略PE头的“程序集比较”工具?
谢谢,
伊恩
差异将是
- PE 标头中的时间戳
- 调试数据的 GUID(如果存在)
(也许还有更多,根据您发布的其他输出?)要查看这些,请运行dumpbin /all /rawdata:none
在 VS 命令提示符下的两个程序集上。
要正确执行此操作,您必须编写一个比较工具来理解这一点并忽略这些字节,或者获取可执行文件的副本,清除时间戳和 GUID,然后比较这些版本。或者,在紧要关头,你可以使用类似的东西fc /b
正如 controlfreak 所建议的,并假设如果有
您很可能会使用清除了时间戳的程序集 - AFAIK,如果您将其连接起来,它仅用于缓存其他 DLL 中导出的符号偏移量 - 但保持原样可能更安全。如果您确实需要二进制相同的程序集,我建议您更改流程,这样除非您确实需要它,否则永远不要进行干净构建。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)