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

时间:2011-06-02 18:04:46

标签: .net visual-studio-2010-sp1

设置:

  • 使用相同的源代码在两台不同的机器上构建.NET 4可执行文件(控制台应用程序)。
  • 两台计算机上的Microsoft Visual Studio 2010 SP1 .NET 4设置相同
  • ildasm projectName.exe /out:test.txt在两台机器的.exe上执行。
  • ildasm输出不同于预期的差异(mvid,privateimplementationdetails)。

问题:
     我花了一些时间创建一个应用程序来获取.NET可执行文件的CRC,并成功地忽略了所有不同的构建时数据。

我正在删除ildasm.exe输出中// =============== CLASS MEMBERS DECLARATION ===================行以上的所有数据。这忽略了MVID。我正在构建没有调试信息的.exe。最后,我解析<PrivateImplementationDetails>{GUID}的输出并忽略它们。

然后我将CRC剩余的文本文件。

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

有没有人知道存储在.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,`  

非常感谢任何见解。

1 个答案:

答案 0 :(得分:1)

两个系统的内核数量是否相同?我可以想象,当计算变量名后缀时,结果可能会有所不同,具体取决于编译器使用的线程数。