【问题标题】:What are the differences in the disassembly of two .NET executables built from the same source code?从相同源代码构建的两个 .NET 可执行文件的反汇编有什么区别?
【发布时间】:2011-06-02 18:04:45
【问题描述】:

设置:

  • 使用相同的源代码在两台不同的机器上构建 .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 设置的不同计算机上构建同一个项目时,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,`  

任何见解将不胜感激。

【问题讨论】:

  • 您确定两个系统都安装了相同的服务包,包括 GAC 中所有 .NET 程序集的相同版本吗?您是否从仅包含源代码的干净目录进行完全重建?当旧版本的程序集留在 bin 和 obj 目录中时,我遇到了类似的奇怪问题。
  • 嗯,谢谢。我会调查这些,但我觉得这个意外的障碍可能会被忽略,因为我们将使用一台“主构建机器”来构建和 crc 一切。那里避免了危机,但我仍然有兴趣弄清楚它们。不幸的是,我可能不得不把这个问题抛在脑后并继续前进(现在已经在这个小东西上工作了很长时间......)。如果我发现任何新内容,我会保持更新。
  • 我建议,当您到达“主构建机器”时,您可以使用 MSBUILD 从命令行进行构建,而不是使用 Visual Studio。使用 MSBUILD 获得可重复的结果,我的运气要好得多。此外,它更容易实现自动化。
  • 非常感谢,我会向我的上级提的:)
  • 两台机器是否运行相同的操作系统并安装了相同的更新?C# 编译器的几个部分已知是不确定的;您在同一台机器上始终获得完全相同的结果这一事实比其他任何事情都更加巧合。编译器生成的标识符在机器之间是否相同是否重要?

标签: .net visual-studio-2010


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2017-04-17
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多