2013-11-28 2 views
0

Если я создаю приложения в .NET 3.5 и примените следующие события после сборки:ILMerge производит другую контрольную сумму на последующее выполнение сборки

if $(ConfigurationName) == Release 
    "C:\Program Files (x86)\Microsoft\ILMerge\ILMerge.exe" 
    /allowDup:DotfuscatorAttribute 
    /ndebug 
    /closed 
    /out:"$(TargetPath)" 
    "$(TargetPath)" 
    "$(TargetDir)HelloWorld.dll" 

где «HelloWorld.dll» содержит один статический класс с единственным статическим методом , контрольная сумма результирующего исполняемого файла будет изменяться при последующих сборках.

Почему?

+0

Знаете ли вы, что компилятор C# не создает идентичные сборки, даже если исходный код не изменяется между сборками? –

+0

Теперь. Благодаря! – user3047278

ответ

2

Это тесно связано с CLI и PE-форматом.

ECMA CLI Specification утверждает, что каждый модуль в сборе (модуль является еще одним звеном в инфраструктуре - насколько я знаю, для регулярных проектов C# VS существует один модуль в сборе, но это также может быть изменен) содержит метаданный ID версии модуля MVID, который отличается для каждой сборки.

Раздел II.22.30 говорит

MVID должен быть заново создается для каждого модуля, используя алгоритм, указанный в ISO/IEC 11578: 1996 (приложение А) или другой совместимый алгоритм .

Кроме того, формат Portable Executable содержит ряд заголовков, некоторые из которых содержат разные временные метки (ссылки, создание файлов и т. Д.). Я не очень разбираюсь в деталях формата, но this huge article может помочь, если вам интересно - это немного старше (19 лет? Wow), но я полагаю, что основы формата все те же.

Это всего лишь две вещи, которые я нашел через пару минут, есть и другие факторы (я также прочитал, что встроенный файл может содержать некоторые данные, специфичные для машины, на которой он был построен), которые вы не можете влияют на сборку .NET.


Если вам нужен надежный способ идентификации сборки, взгляните на Strong-Named Assemblies и как их создать.

+0

Спасибо за информацию. Я не знал, что сборки изменяются при каждой сборке. Я осознал свою ошибку, я нажал «Создать» вместо «Перестроить». В результате контрольная сумма изменилась при выполнении ILMerge, но если ILMerge не был использован, сборка никогда не будет восстановлена. – user3047278