ILMerge производит другую контрольную сумму при последующих сборках
Если я создаю приложение.NET 3.5 и применяю следующее событие после сборки:
if $(ConfigurationName) == Release
"C:\Program Files (x86)\Microsoft\ILMerge\ILMerge.exe"
/allowDup:DotfuscatorAttribute
/ndebug
/closed
/out:"$(TargetPath)"
"$(TargetPath)"
"$(TargetDir)HelloWorld.dll"
где "HelloWorld.dll" содержит один статический класс с одним статическим методом, контрольная сумма результирующего исполняемого файла будет изменяться при последующих сборках.
Зачем?
1 ответ
Это тесно связано с CLI и форматом PE.
Спецификация CLI ECMA гласит, что каждый модуль в сборке (модуль - это просто еще одна единица в инфраструктуре - насколько я знаю, для обычных проектов C# VS в сборке есть один модуль, но его также можно изменить) содержит идентификатор версии модуля метаданный MVID, который отличается для каждой сборки.
Раздел II.22.30 говорит
Mvid должен быть сгенерирован заново для каждого модуля, используя алгоритм, указанный в ИСО / МЭК 11578:1996 (Приложение A), или другой совместимый алгоритм.
Кроме того, формат Portable Executable содержит серию заголовков, некоторые из которых содержат разные временные метки (связывание, создание файла и т. Д.). Я не очень разбираюсь в деталях формата, но эта огромная статья может помочь, если вам интересно - она немного старше (19 лет? Вау), но я полагаю, что основы формата все те же.
Это всего лишь две вещи, которые я обнаружил за пару минут, вероятно, есть и другие факторы (я также читал, что встроенный файл может содержать некоторые данные, относящиеся к компьютеру, на котором он был построен), на который вы не можете повлиять при создании Сборка.NET.
Если вам нужен надежный способ идентифицировать вашу сборку, взгляните на сборки со строгими именами и способы их создания.