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

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

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

Это использует Visual Studio 2005/WinForms.

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

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

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

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

Ответы

Ответ 1

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

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

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

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

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

View > MetaInfo > Show!

Ответ 3

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