2009-08-26 1 views
11

Каждый раз, когда мы перекомпилируем наше приложение C#, мы получаем EXE с различными сигнатурами MD5. Мы перекомпилируем одну и ту же машину, минуты друг от друга. Почему же тот же исходный код не дает того же выхода? Есть ли способ исправить это?Почему C# генерирует разные EXE для одного и того же исходного кода?

+0

Я думаю, у вас уже есть, но ... вы проверили манифест с IL DASM? – yeyeyerman

ответ

17

«Таким образом, каждый узел имеет:

  1. A Timestamp, в двух местах
  2. GUID, которые соответствовали PDB
  3. То, что кажется совершенно случайным GUID генерируется каждый компиляции
  4. A. который указывает, что представляет собой сборка сборки - генерируется только в последующих сборках Visual Studio ».

от:

http://ritter.vg/#code_adventures_clr1

+0

Хороший ответ. Благодаря! – Gili

2

Мне пришлось вскрывать эти случаи раньше, и, похоже, это изменения типа DateTime-stamp (это предположение). Если вы поместите обе сборки в инструменты diff, вы увидите, что только очень небольшое количество строк в PE изменилось; если вы измените даже небольшое количество кода и сравните сборки, вы увидите значительно большие различия.

Вот вопрос, который я открыл, исследуя инструменты, чтобы определить «реальное» отличие от поверхностных:

.NET Assembly Diff/Compare Tool - What’s available?

0

Там будет построен в номере версии, которая будет меняться с каждой сборкой.

+2

Даже если версия сборки установлена ​​статически на что-то вроде «1.0.0.0»? Единственный раз, когда версия сборки должна измениться, если вы ее определили как «1.0.0. *» Или вручную измените ее, нет? – STW

+0

Версия сборки уже установлена ​​на статическое значение. – Gili

4

Я думаю, что ключ может быть «минут друг от друга». Если в EXE есть метка времени, это изменит подпись MD5.

+0

Это догадка? – Gili

+0

Я никогда не рассматривал EXE, созданный компилятором C#, и я больше не коснулся C# в течение года. Но все это прекрасно объясняет, и это имеет смысл. –

2

Скорее всего, у вас есть несколько * в номере версии сборки. Это приводит к тому, что номер версии сборки будет автоматически увеличиваться при сборке, что приведет к заметной разнице в выводимой сборке. Следовательно, другая контрольная сумма MD5.

Попробуйте переключить номер версии на постоянную версию сборки и посмотрите, не устраняет проблему.

2

Вы можете попробовать запустить ildasm.exe (мой путь для этого C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin) на два .exes.

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

+0

Я настоятельно рекомендую использовать флаги/source и/out. –

Смежные вопросы