Каждый раз, когда мы перекомпилируем наше приложение С#, мы получаем EXE с различными сигнатурами MD5. Мы перекомпилируем одну и ту же машину, минуты друг от друга. Почему же тот же исходный код не дает того же выхода? Есть ли способ исправить это?
Почему С# генерирует разные EXE файлы для одного и того же исходного кода?
Ответ 1
"Таким образом, каждая сборка имеет:
- Временная метка в двух местах
- GUID, который соответствует PDB
- То, что кажется полностью случайным GUID, сгенерированным каждым компилятором.
- Счетчик, указывающий, что сборка сборки - сгенерирована только в последующих сборках Visual Studio.
от
Ответ 2
Я думаю, что ключ может быть "минут друг от друга". Если в EXE есть метка времени, это изменит подпись MD5.
Ответ 3
Мне пришлось разбирать эти случаи раньше, и, похоже, это просто изменения типа DateTime-stamp (это предположение). Если вы поместите обе сборки в инструменты diff, вы увидите, что только очень небольшое количество строк в PE изменилось; если вы измените даже небольшое количество кода и сравните сборки, вы увидите значительно большие различия.
Вот вопрос, который я открыл, исследуя инструменты для определения "реальных" отличий от поверхностных:
Ответ 4
Скорее всего, у вас есть несколько * в номере версии сборки. Это приводит к тому, что номер версии сборки будет автоматически увеличиваться при сборке, что приведет к заметной разнице в выводимой сборке. Следовательно, другая контрольная сумма MD5.
Попробуйте переключить номер версии на постоянную версию сборки и посмотрите, устраняет ли это проблему.
Ответ 5
Вы можете попробовать запустить ildasm.exe(мой путь для этого - C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin
) на двух .exe.
Затем выгрузите необработанное представление заголовков и сравните их с инструментом diff. Если по-прежнему нет никакой разницы, то это могут быть заголовки PE, которые нуждаются в более продвинутом инструменте для обнаружения. Ildasm дает вам размер заголовка PE и другие статистические данные, хотя.
Ответ 6
Будет создан встроенный номер версии, который будет изменяться с каждой сборкой.