Почему после чистой сборки создается другая dll, без изменений кода? - PullRequest
15 голосов
/ 20 сентября 2008

Когда я делаю чистую сборку моего C # проекта, созданный dll отличается от ранее созданного (который я сохранил отдельно). Никаких изменений кода не было сделано, просто очистите и восстановите.

Diff показывает, что некоторые байты в DLL имеют изменения - немногие в начале и немного в конце, но я не могу понять, что они представляют. Кто-нибудь знает, почему это происходит и как это предотвратить?

Используется Visual Studio 2005 / WinForms.

Обновление: Не используется автоматическое увеличение версии или подписывание сборки. Если это какая-то временная метка, как мне запретить VS писать?

Обновление: После просмотра в Ildasm / diff, похоже, что следующие элементы отличаются:

  • Два байта в PE-заголовке в начале файла.
  • { guid } раздел
  • Загадочная часть таблицы строк ближе к концу (интересно, почему я не изменил строки)
  • Части информации о сборке в конце файла.

Не знаю, как устранить все это, если это вообще возможно ...

Ответы [ 3 ]

14 голосов
/ 20 сентября 2008

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

Некоторые из столбцов Ecma-335 Partition II (Определение метаданных спецификации CLI), которые могут меняться для каждой сборки, даже если исходный код вообще не меняется:

  • Module.Mvid: GUID, сгенерированный во время сборки. Всегда меняется, каждая сборка.
  • AssemblyRef.HashValue: может измениться, если вы ссылаетесь на другую сборку, которая также была перестроена после старой сборки.

Если это действительно очень беспокоит вас, мой лучший совет по выяснению того, что именно меняется, - это анализ реальных таблиц метаданных. Чтобы получить их, используйте окно MetaInfo ildasm:

View > MetaInfo > Raw:Header,Schema,Rows // important, otherwise you get very basic info from the next step

View > MetaInfo > Show!
10 голосов
/ 20 сентября 2008

Я думаю, что это будет поле TimeDateStamp в заголовке IMAGE_FILE_HEADER спецификаций PE32 .

0 голосов
/ 20 сентября 2008

Возможно, что номера сборки или ревизии изменились.

...