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