Почему C # генерирует разные EXE-файлы для одного и того же исходного кода? - PullRequest
13 голосов
/ 26 августа 2009

Каждый раз, когда мы перекомпилируем наше приложение C #, мы получаем EXE-файлы с разными сигнатурами MD5. Мы перекомпилируем на одной машине с разницей в несколько минут. Почему один и тот же исходный код не дает одинаковый результат? Есть ли способ это исправить?

Ответы [ 6 ]

18 голосов
/ 26 августа 2009

"Итак, каждая сборка имеет:

  1. Метка времени, в двух местах
  2. GUID, соответствующий PDB
  3. То, что выглядит как абсолютно случайный GUID, генерируемый при каждой компиляции.
  4. Счетчик, указывающий, что такое сборка сборки - генерируется только в последующих сборках Visual Studio. "

от

http://ritter.vg/#code_adventures_clr1

4 голосов
/ 26 августа 2009

Я думаю, что ключом могут быть «минуты друг от друга». Если в EXE-файле есть временная метка, это изменит подпись MD5.

2 голосов
/ 26 августа 2009

Вы можете попробовать запустить ildasm.exe (мой путь для этого C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin) на двух .exes.

Затем выведите необработанный вид заголовков и сравните их с помощью инструмента сравнения. Если все еще нет никакой разницы, то это могут быть заголовки PE, для обнаружения которых потребуется более продвинутый инструмент. Хотя Ildasm дает вам размер PE-заголовка и другую статистику по нему.

2 голосов
/ 26 августа 2009

Скорее всего, у вас есть несколько * в номере версии сборки. Это приводит к автоматическому увеличению номера версии сборки при сборке, что приведет к заметному различию в выводимой сборке. Следовательно, другая контрольная сумма MD5.

Попробуйте переключить номер версии на версию с постоянной сборкой и посмотрите, решит ли это проблему.

2 голосов
/ 26 августа 2009

Мне приходилось анализировать эти случаи раньше, и похоже, что это просто изменения типа штампа DateTime (это предположение). Если вы поместите обе сборки под инструменты сравнения, вы увидите, что изменилось только очень небольшое количество линий в PE; если вы измените даже небольшой объем кода и сравните сборки, вы увидите значительно большие различия.

Вот вопрос, который я открыл, исследуя инструменты для выявления «реальных» отличий от поверхностных:

.NET Diff / Compare Tool - Что доступно?

0 голосов
/ 26 августа 2009

Будет встроенный номер версии, который будет меняться при каждой сборке.

...