Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我怎样才能知道;“装配”;真的改变了吗?_C#_Comparison_File Comparison - Fatal编程技术网

C# 我怎样才能知道;“装配”;真的改变了吗?

C# 我怎样才能知道;“装配”;真的改变了吗?,c#,comparison,file-comparison,C#,Comparison,File Comparison,我在VS2005中创建了一个简单的“Hello World”应用程序。这是一个直接的控制台应用程序;它只包含以下行: Console.WriteLine("Hello World"); Console.ReadLine(); 当我尝试在不执行任何更改的情况下重建同一个控制台应用程序时(只需按rebuild按钮),我得到了一个微妙不同的可执行文件。(我从第一个和第二个生成的可执行文件生成了一个SHA-1哈希,这是不同的!) 为什么在没有代码更改的情况下会有所不同?到底发生了什么变化?我使用十六进

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

Console.WriteLine("Hello World");
Console.ReadLine();
当我尝试在不执行任何更改的情况下重建同一个控制台应用程序时(只需按rebuild按钮),我得到了一个微妙不同的可执行文件。(我从第一个和第二个生成的可执行文件生成了一个SHA-1哈希,这是不同的!)

为什么在没有代码更改的情况下会有所不同?到底发生了什么变化?我使用十六进制编辑器进行比较,只看到了几个不同的字节

我想我的最终问题是,我如何知道“程序集”是否真的发生了变化?(当然不看文件版本、文件大小等)

编辑

到目前为止,我们已经确定差异在于PE头(时间戳和一些调试数据)。在我重新发明轮子之前,有没有忽略PE标题的“组装比较”工具

谢谢, 命令行上的Ian


fc/b差异将

  • PE头中的时间戳
  • 调试数据的GUID(如果存在)
(根据您发布的其他输出,可能还有其他内容?)要查看这些内容,请在VS命令提示符下对两个程序集运行
dumpbin/all/rawdata:none

要正确地执行此操作,您必须编写一个比较工具,该工具理解这一点并忽略这些字节,或者复制可执行文件,清除时间戳和GUID,然后比较这些版本。或者,在紧要关头,您可以像controlfreak建议的那样使用
fc/b
,并假设如果有<20个字节不同(时间戳为4个字节,GUID为16个字节),则可能是相同的


使用清除了时间戳的程序集很可能会得逞——如果您连接了它,它只用于在其他DLL中缓存导出的符号偏移量——但保持原样可能更安全。如果您确实需要二进制完全相同的程序集,我建议您更改流程,这样您就永远不会清理生成,除非您确实需要它。

在Visual Studio命令提示符下,您可以进行更详细的比较:

  • 您可以使用
    dumpbin
    的输出来比较PE头:

    dumpbin /HEADERS assembly.dll
    
  • 或者,您可以使用
    ildasm
    比较PE头和程序集中嵌入的IL代码:

    ildasm /ALL /TEXT assembly1.dll > dump1.txt
    ildasm /ALL /TEXT assembly2.dll > dump2.txt
    fc dump1.txt dump2.txt        
    
    /ALL
    选项将转储DOS和PE头、CLR头、程序集元数据和反汇编IL。但是,它将不包含嵌入式资源。如果您的组件包含嵌入式资源,则可以使用
    /OUT
    选项。这将为每个嵌入式资源创建一个单独的文件,您可以使用自己喜欢的diff工具(例如WinMerge:

    ildasm /ALL /TEXT /OUT:folder1\dump.txt folder1\assembly.dll
    ildasm /ALL /TEXT /OUT:folder2\dump.txt folder2\assembly.dll
    

这应该是答案吗?至少提供一些上下文。哈哈,对不起。我把一些东西放在括号里,它认为它们是html标记比较文件a.exe和B.exe 00000088:92 A4 00000770:F4 DD 00000771:62 20 00000772:7F CF 00000773:A1 24 00000774:0B AA 00000775:5A 16 00000776:7A 9A 00000777:43 41 00000778:B7 9D 00000779:F3 39 0000077A:22 C00000077B:8D BF 0000077C:50 82 0000077D:17 1D 0000077E:5227 0000077F:D6 4A 000008CC:92 A4 000008E8:2A 8D 000008E9:6D 26 000008EA:C2 21 000008EB:F0 F4 000008EC:70 D4 000008ED:1E 98 000008EE:3F 76 000008EF:4B 4D 000008F0:AC B7 000008F1:5A 0D 000008F2:75 9C 000008F3:E0 3E 000008F4:4D 39 000008F5:83 8E000008F6:6E 54 000008F7:1E 26000008F8:02嗯,这比我预期的要多。要查看实际更改的内容,请在VS命令提示符下(或运行
vsvars32
),在两个文件上运行
dumpbin/all/rawdata:none
,然后windiff输出。第一个是时间戳,我猜其中一个是调试GUID,但我不知道第三个是什么。为了正确忽略这些字节,我需要知道这些字节的位置和范围,对吗?是否有某种文档我可以阅读?这里是MSDN的PE格式文档链接:我指的是COFF头中的时间戳和调试目录的内容。然而,如果做这件事的工具还不存在的话,我会非常惊讶——但我不知道有一个,对不起。哇,你搞定了。它是时间戳和一些调试数据!4C4953A4时间戳Fri Jul 23 16:32:36 2010 4C4953A4 cv 6D 000026E4 8E4格式:RSDS,{F42126D-98D4-4D76-B70D-9C3E398E5426},1,C:\HelloWorld\HelloWorld\obj\x86\Debug\HelloWorld.pdb*使用dumpbin/all/rawdata:none