В чем отличия в разборке двух исполняемых файлов .NET, построенных из одного и того же исходного кода?

Настройка:

  • используется один и тот же исходный код. Создайте исполняемый файл .NET 4 (консольное приложение) на двух разных машинах.
  • Настройки Microsoft Visual Studio 2010 SP1.NET 4 идентичны на двух машинах.
  • ildasm projectName.exe /out:test.txt выполняется на .exe с обеих машин.
  • Выход ildasm отличается от ожидаемых различий (mvid, privateimplementationdetails).

Вопрос:
   Я потратил некоторое время на создание приложения для получения CRC исполняемого файла .NET и преуспел в игнорировании всех разных данных времени сборки.

Я удаляю все данные выше строки // =============== CLASS MEMBERS DECLARATION =================== в выход ildasm.exe. Это игнорирует MVID. Я создаю .exe без отладочной информации. И, наконец, я разбираю вывод для <PrivateImplementationDetails>{GUID} и игнорирую их.

Затем я CRC оставшийся текстовый файл.

CRC одинаковы, когда один и тот же проект построен на одном компьютере, но отличается, когда один и тот же проект построен на другом компьютере с идентичным исходным кодом и настройками MSVS 2010.

Кто-нибудь знает какую-либо машино-зависимую информацию, хранящуюся в сборке исполняемого файла .NET?

Ниже приведен пример различий. Похоже, что различным идентификаторам присваиваются каждый объект и класс, но я считаю странным, что это будет отличаться только тогда, когда код будет построен на разных машинах...

         `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

У обеих систем одинаковое количество ядер? Я мог себе представить, что когда дело доходит до подсчета суффикса имени переменной, результат может отличаться в зависимости от количества потоков, используемых для компилятора.