Побитовое сравнение .exe и .dll с включенным AssemlyInfo.cs

Фон:

Меня обвинили в попытке придумать новый способ сравнения dll и exe, которые используют AssemblyInfo для встраивания номера версии. Каждый раз, когда мы делаем новую сборку, версия соответственно увеличивается. Однако, когда приходит время для развертывания новой версии, мы хотим копировать только те dll и exe, которые действительно изменились, но встроенный номер версии создает впечатление, что это всегда так.

Чтобы обойти это, система в настоящее время просто полагалась на сравнение размера файла, но моя задача возникла из-за того, что я заметил, что это недостаточно хорошо, поскольку нам не удалось развернуть новый exe, несмотря на то, что он изменился; они просто имеют одинаковый размер файла. Мы не знаем, как часто это происходит, поэтому нам нужно что-то с этим делать, но, если возможно, мы хотели бы по-прежнему разумно заменять библиотеки dll и исполняемые файлы, чтобы пользователям не приходилось каждый раз закрывать пользовательский интерфейс. нам действительно нужно только заменить файлы, которые пользовательский интерфейс не использует.

Поэтому мой вопрос заключается в том, есть ли умный способ сравнить исполняемые файлы и DLL со встроенными версиями с использованием AssemblyInfo, игнорируя при этом сами эти метаданные. Чем больше я оглядывался, тем больше казалось, что это, вероятно, невозможно, но я подумал, что стоит спросить, прежде чем сдаваться и каждый раз переходить на замену всего.

Цените помощь!

Редактировать: я полагаю, что одна вещь, на которую я действительно надеялся, будет возможной, это побитовое сравнение с определенными смещениями. Всегда ли AssemblyInfo компилируется в определенный момент, например, в качестве верхнего или нижнего колонтитула, которые можно учитывать при сравнении?


person Mr. Robot    schedule 31.10.2012    source источник
comment
Вы столкнетесь с проблемой, так как .Net обычно настроен на использование номеров версий, чтобы определить, отличается ли что-то.   -  person user7116    schedule 31.10.2012
comment
Не следует ли делать ставку, если для ссылки «конкретная версия» установлено значение false?   -  person Cake or Death    schedule 31.10.2012


Ответы (2)


Эрик Липперт имеет уже освещал это:

Гарантируется ли, что компиляция одной и той же программы на C# дважды даст один и тот же двоичный вывод?
Нет.
Ну, это было легко написать в блог.
...
Компилятор C# по своей конструкции никогда не создает один и тот же двоичный файл дважды. Компилятор C# встраивает свежесгенерированный идентификатор GUID в каждую сборку при каждом ее запуске, тем самым гарантируя, что никакие две сборки никогда не будут полностью идентичными.

person Richard Deeming    schedule 31.10.2012
comment
Ну, это в значительной степени отвечает на него. Похоже, что теоретически возможно выбрать части для сравнения, но это огромная боль в шее, крайне обескураживающая, и не гарантируется, что она будет работать в будущем при изменении компилятора. Ценить это! - person Mr. Robot; 31.10.2012

Не обновлять номера версий во всех файлах. Скорее обновляйте версию только в тех файлах, которые изменились. Это потребует некоторых изменений в процессе сборки, но решит вашу проблему.

person samoz    schedule 31.10.2012