Производит ли перекомпиляция программы бинарный идентичный двоичный файл?
Для всех компиляторов? Нет. Компилятору C #, по крайней мере, не разрешено.
У Эрика Липперта очень подробное объяснение того, почему вывод компилятора не является детерминированным.
[T] компилятор C # по своей конструкции никогда не создает один и тот же двоичный файл дважды. Компилятор C # внедряет только что сгенерированный GUID в каждую сборку каждый раз, когда вы его запускаете, тем самым гарантируя, что никакие две сборки никогда не будут побитово идентичны. Чтобы процитировать из спецификации CLI:
Столбец Mvid должен индексировать уникальный GUID [...], который идентифицирует этот экземпляр модуля. [...] Mvid должен быть заново сгенерирован для каждого модуля [...] Хотя само [время выполнения] не использует Mvid, другие инструменты (например, отладчики [...]) полагаются на тот факт, что Mvid почти всегда отличается от одного модуля к другому.
Хотя это специфично для версии компилятора C #, многие пункты в статье могут быть применены к любому компилятору.
Во-первых, мы предполагаем, что мы всегда получаем один и тот же список файлов каждый раз в одном и том же порядке. Но это в некоторых случаях зависит от операционной системы. Когда вы говорите «csc * .cs», порядок, в котором операционная система выводит список подходящих файлов, является подробностью реализации операционной системы; компилятор не сортирует этот список в каноническом порядке.