2015-09-17 3 views
1

У меня есть build task, который выполняет вычислительно дорогостоящую работу на нескольких сборках. Работа основана на коде IL, и тот же код всегда дает тот же результат.Как определить, что сборка действительно изменилась?

Я думал, что было бы неплохо кэшировать результаты работы, но при реализации кэширования я заметил, что каждый раз, когда проект скомпилирован (например, когда я нажимаю «Перестроить в Visual Studio»), произведенный сборка различна, даже если исходный код остается неизменным.

Одно из отличий от MVID, то есть Module.ModuleVersionId. Кажется, что есть еще одно изменение, но я еще не смог определить его природу. №

Учитывая, что простой diff сборок всегда будет показывать, что сборки разные, каковы мои другие варианты?

Декомпиляция сборки IL и обрезка MVID кажется слишком большой работой для основной задачи.


¹ В то время как WinMerge показывает два отличия в двух совершенно разных местах на бинарном уровне, я могу видеть только разницу MVID при сравнении сборок в ILSpy.

+1

Сборка представляет собой файл PE32, в нем хранится дата сборки в заголовке. IMAGE_FILE_HEADER.TimeDateStamp. Вы можете увидеть его с помощью Dumpbin.exe/headers –

ответ

1

До недавнего времени вы не могли, по крайней мере, не легко. Было много частей процесса компиляции C# или VB.NET (я предполагаю, что это то, что вы используете), которые не были детерминированными.

Но с Roslyn 1.2/Visual Studio 2015 Update 2 есть a new option for deterministic output. Вы можете выбрать этот режим, передав /deterministic в csc/vbc или вручную добавив <Deterministic>true</Deterministic> к вашему csproj/vbproj.

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