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

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

6 ответов

Решение

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

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

от:

http://ritter.vg/

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам