Каковы эти различия в двух файлах DLL, созданных из одного и того же исходного кода

Весь мой код находится под контролем источника, поэтому я на 100% уверен, что исходный код не изменился. Но если я дважды создаю C # DLL, их содержимое будет немного другим. Я могу воспроизвести проблему в 100% случаев, просто построив, а затем построив снова.

Похоже, что это вообще не влияет на программу, но такие инструменты, как MSIMSP, используемые для создания исправлений из двух файлов MSI, отбрасываются этими мельчайшими изменениями. Делаем патчи (для моего продукта) в 40 раз больше, чем должны быть.

Я декомпилировал обе библиотеки DLL, и информация об их сборках, классах и т. Д. Точно такая же. Файлы также имеют точно такой же размер, но, конечно же, для них разное время создания. Так что я действительно не могу понять, что изменилось.

Итак, я копнул немного глубже.

Я использовал WinDiff, чтобы найти изменения, а затем сделал перекрестные ссылки в шестнадцатеричном редакторе. WinDiff показывает изменение во второй «строке» и в строке примерно на 80% файла.

В шестнадцатеричном редакторе я вижу, что первый измененный байт - это байт 0x088 (байт 136). Кажется, это единственный измененный байт в этой «строке». Мне не удается найти второе изменение, поскольку WinDiff не сообщает мне точное смещение в байтах изменения.

Вот изображение изменений, правый файл - это содержимое более нового файла. Шестнадцатеричный вид

Кто-нибудь, знакомый с составом (C #) DLL-файлов, знает, что может означать измененный байт? Или еще лучше, как сделать так, чтобы файлы DLL оставались неизменными при их пересборке?


person Roy T.    schedule 02.12.2016    source источник
comment
Иногда в моей папке bin / release есть файл с именем $ RANDOM_SEED $, и содержимое этого файла изменяется каждый раз, когда я перестраиваю. Я не вдавался в подробности, но могу представить, что это одно из двух изменений. Кому-то нужно будет провести некоторые исследования. ИЗМЕНИТЬ: (его модуль, вероятно, не влияет на dll, так что забудьте мой комментарий) stackoverflow.com/ a / 40382757/5962841   -  person Mafii    schedule 02.12.2016
comment
Возможно, стоит попробовать хороший текстовый / шестнадцатеричный редактор, такой как Vedit. Я использую его с 1989 года. Это хороший инструмент, который будет в вашем распоряжении даже в наши дни IDE и intellisense. www.vedit.com   -  person Michael Gorsich    schedule 02.12.2016
comment
Как определить, являются ли две библиотеки DLL Net same, похоже, подходит к той же проблеме под другим углом.   -  person Damien_The_Unbeliever    schedule 02.12.2016
comment
stackoverflow.com/questions/8927558/   -  person Matteo Umili    schedule 02.12.2016
comment
Ссылка @ Matteo должна прояснить это!   -  person TaW    schedule 02.12.2016


Ответы (2)


Это может иметь какое-то отношение к различиям между сборкой и перестройкой.

Разница между сборкой решения, восстановлением решения и очисткой Решение в Visual Studio?

если он не думает, что ему нужно перестраивать проект, он этого не сделает. Он также может использовать частично построенные части проекта, если они не изменились.

Выполнение сборки использует метаданные за кулисами, и поэтому ваша dll может быть другой.

Почему другое dll, созданный после чистой сборки без изменений кода?

РЕШЕНИЕ:

Вам потребуется выполнить детерминированную сборку, как описано здесь < / а>

person Fuzzybear    schedule 02.12.2016
comment
Да, но при многократной сборке каждый раз должны создаваться одни и те же двоичные файлы, не так ли? - person Mafii; 02.12.2016
comment
@Mafii К сожалению, всегда что-то происходит за кулисами ... метаданные выглядят как stackoverflow.com/questions/107196/, поэтому нет, они не будут создавать одинаковые бинарные файлы - person Fuzzybear; 02.12.2016
comment
@Fuzzybear есть ли способ игнорировать эти байты метаданных для создания патчей? (Может быть, мне стоит задать это как отдельный вопрос) - person Roy T.; 02.12.2016
comment
@Roy T Не то, чтобы я извиняюсь, я бы попробовал перестроить сборку, и если бы это не сработало, тогда да, я бы спросил, как вырезать метаданные и т.д ... может быть еще один компилятор, который позволяет вам делать что тебе может быть нужно? - person Fuzzybear; 02.12.2016
comment
@FuzzyBear Я наткнулся на blog.paranoidcoding.com/2016 / 04/05 /, в котором говорится, что для Roslyn существует / детерминированный параметр сборки. Надеюсь, что это сработает: D - person Roy T.; 02.12.2016
comment
Удивительная находка @RoyT. и его первая строка: кажется глупым отмечать особенности, которые должны были быть там с самого начала, добавляя ссылку на мой ответ - person Fuzzybear; 02.12.2016

Если вы внесли изменения в dll, это повлияет на размер. Я добавил несколько дополнительных свойств в перечисление, и файл стал примерно на 3 КБ больше. Это также может быть невидимое изменение из-за декомпрессии, из-за которой файл выглядит иначе.

person Nemavhidi    schedule 05.12.2019