ДРУГОЕ ОБНОВЛЕНИЕ:
С 2015 года команда компиляторов прилагает усилия для извлечения источников недетерминированности из цепочки инструментов компилятора, чтобы идентичные входные данные действительно давали идентичные выходные данные. Для получения дополнительной информации см. Тег «Концептуальный детерминизм» на Roslyn Github.
ОБНОВЛЕНИЕ: Этот вопрос был темой моего блога в мае 2012 года . Спасибо за отличный вопрос!
Как это возможно?
Очень легко.
Разве двоичный результат не должен быть точно одинаковым для одного и того же входа?
Абсолютно нет. Все наоборот. Каждый раз, когда вы запускаете компилятор, вы должны получать другой вывод. В противном случае, как вы могли знать, что перекомпилируете?
Компилятор C # внедряет только что сгенерированный GUID в сборку при каждой компиляции, тем самым гарантируя, что никакие две компиляции не дадут абсолютно одинаковый результат.
Более того - даже без GUID компилятор не дает никаких гарантий, что две «одинаковые» компиляции будут давать одинаковые результаты.
В частности, порядок заполнения таблиц метаданных сильно зависит от деталей файловой системы; компилятор C # начинает генерировать метаданные в порядке, в котором ему передаются файлы, и это может быть слегка изменено различными факторами.
из-за того, что наш сервер сборки работает, проверенные изменения вызывают перестроение, в результате чего вновь измененные двоичные файлы проверяются по кругу.
Я бы исправил это на твоем месте.