从同一源代码构建的两个.NET可执行文件的反汇编有什么区别?

从同一源代码构建的两个.NET可执行文件的反汇编有什么区别?,.net,visual-studio-2010,.net,Visual Studio 2010,设立: 相同的源代码用于在两台不同的机器上构建.NET4可执行文件(控制台应用程序) 两台计算机上的Microsoft Visual Studio 2010 SP1.NET 4设置相同 ildasm projectName.exe/out:test.txt在两台计算机的.exe上执行 ildasm输出的差异超出了预期差异(mvid、privateimplementationdetails) 问题: 我花了一些时间创建了一个应用程序来获取.NET可执行文件的CRC,并成功地忽略了所有不同的构建

设立:

  • 相同的源代码用于在两台不同的机器上构建.NET4可执行文件(控制台应用程序)
  • 两台计算机上的Microsoft Visual Studio 2010 SP1.NET 4设置相同
  • ildasm projectName.exe/out:test.txt
    在两台计算机的.exe上执行
  • ildasm输出的差异超出了预期差异(mvid、privateimplementationdetails)
问题:
我花了一些时间创建了一个应用程序来获取.NET可执行文件的CRC,并成功地忽略了所有不同的构建时数据

我正在删除ildasm.exe输出中
/=======================================================
行上方的所有数据。这将忽略MVID。我正在生成没有调试信息的.exe。最后,我解析
{GUID}
的输出并忽略它们

然后我对剩余的文本文件进行CRC

当同一项目在同一台计算机上构建时,CRC是相同的,但当同一项目在具有相同源代码和MSVS 2010设置的不同计算机上构建时,CRC是不同的

有人知道存储在.NET可执行文件程序集中的任何机器相关信息吗

下面是一个不同的例子。似乎每个对象和类都分配了不同的ID,但我觉得奇怪的是,只有当它们在不同的机器上编译代码时,它们才会有所不同

         `class DSC_PI.MainWindow/'<>c__DisplayClass21' V_2,`
         `class DSC_PI.MainWindow/'<>c__DisplayClass10' V_2,`  

         `class DSC_PI.MainWindow/'<>c__DisplayClass1e' V_3,`
         `class DSC_PI.MainWindow/'<>c__DisplayClassd' V_3,`  
`class DSC\u PI.MainWindow/'c\uu DisplayClass21'V\u 2`
`类DSC_PI.MainWindow/'c__DisplayClass10'V_2,`
`类DSC_PI.MainWindow/'c___DisplayClass1e'V_3`
`类DSC\u PI.MainWindow/'c\u\u DisplayClassd'V\u 3,`

如果您有任何见解,我们将不胜感激。

两个系统的内核数是否相同?我可以想象,当计算变量名后缀时,结果可能会因编译器使用的线程数而异。

您确定两个系统安装了相同的service Pack,包括GAC中所有.NET程序集的相同版本吗?您是否正在从只包含源代码的干净目录进行完全重建?当旧版本的程序集被放在bin和obj目录中时,我也遇到了类似的奇怪问题。我将研究这些,但我觉得这个意外的故障可能会被忽略,因为我们将使用一个“主构建机器”来构建和crc所有东西。危机在那里得以避免,但我仍有兴趣找出答案。不幸的是,我可能不得不把这个问题抛在脑后,继续前进(这件小事已经做了很长时间了…)。但是,如果我发现任何新的内容,我将保持此更新。我建议,当您进入“主生成计算机”时,使用MSBUILD从命令行而不是使用Visual Studio进行生成。使用MSBUILD,我很幸运地获得了可复制的结果。另外,它更容易实现自动化。非常感谢,我将向我的上级提到:)这两台机器运行的操作系统是否安装了相同的更新?C#编译器有几个部分是不确定的;在同一台机器上始终得到完全相同的结果这一事实比其他任何事情都更像是巧合。编译器生成的标识符在不同的机器上是否相同有什么关系吗?