.NET Assembly Diff / Compare Tool – Что доступно?

Я хотел бы иметь возможность выполнять разницу между уровнями кода между двумя assemblyми; плагин Diff для Reflector – это самая близкая вещь, которую я нашел до сих пор, но сравнить всю сборку – это ручной процесс, требующий от меня развернуть все пространства имен / class / метод.

Другие инструменты, которые я нашел до сих пор, по-видимому, ограничены различиями API-уровня (пространства имен, classов, методов), которые не будут сокращать его для того, что я ищу.

Кто-нибудь знает о таком инструменте? Мои требования (от наивысшего до самого низкого):

  • Уметь анализировать / отражать содержимое кода в двух версиях одной и той же сборки и сообщать о различиях
  • Принять папку или группу сборок в качестве входных данных; быстро сравнивайте их (аналогично папке diff для WinMerge)
  • Быстрая возможность определить, эквивалентны ли две сборки на уровне кода (а не только в API)
  • Позвольте легко разобраться в различиях
  • Экспорт отчетов о различиях

(Лично мне нравится WinMerge для разграничения текста, поэтому приложение с похожим интерфейсом было бы здорово)

Инструмент NDepend предлагает множество функций для обработки .NET code diff.

Панель « Поиск по изменению» предназначена для просмотра кода сборок:

введите описание изображения здесь


Предложено множество кодовых правил, которые ограничивают разницу и эволюцию. Они могут хорошо начать писать свои собственные или адаптировать их к вашим потребностям. Например, посмотрите правило:

Типы, которые раньше были на 100% покрыты, но не больше

// Types that used to be 100% covered but not anymore warnif count > 0 from t in JustMyCode.Types where t.IsPresentInBothBuilds() && t.OlderVersion().PercentageCoverage == 100 && t.PercentageCoverage < 100 let culpritMethods = t.Methods.Where(m => m.PercentageCoverage < 100) select new {t, t.PercentageCoverage, culpritMethods } 

или также:

  • Изменения в API: методы
  • Избегайте более сложных методов
  • Избегайте снижения охвата кода тестированием типов
  • С этого момента все добавленные или реорганизованные типы должны уважать основные принципы качества
  • Избегайте преобразования неизменяемого типа в изменчивый
  • Эвристический поиск типов, перемещаемых из одного пространства имен или сборки в другой

Чтобы начать работу с возможностями сравнения NDepend, ознакомьтесь с документацией:

  • Advanced Code Diff из Visual Studio : объясняет, как использовать функции сравнения сборки NDepend, в контексте автономного пользовательского интерфейса Visual Studio и Visual NDepend .

  • Reporting Code Diff : объясняет, как использовать функции сравнения сборки NDepend в контексте отчетности .

Отказ от ответственности: я работаю для NDepend

Вы можете использовать ILDasm для генерации il-источника из сборки. Источник IL – это в основном текстовый файл, поэтому вы можете сравнить два файла il, используя стандартные инструменты для сравнения текста. Интерпретация источников IL может не понадобиться, если вы используете сообщенные различия как указание, где искать дальше.

Попробуйте эти:

  • NDepend
  • Дизайн-студия Framework

ILSpy может декомпилировать сборку для аккуратной структуры каталогов. Сделайте это для каждой из своих сборок, и вы можете использовать инструмент diff по вашему выбору, чтобы увидеть, что изменилось.

Это своего рода дублированный вопрос, к этому .

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

Я считаю, что есть аддон Reflector для этого по адресу http://www.codeplex.com/reflectoraddins, называемый diff. Вы можете попробовать это.

Диффеин для рефлектора отлично! Я использовал его в течение многих лет.

Я сделал небольшой инструмент специально для сравнения ассемблий определенным образом. У меня было две сборки, которые были в основном одинаковыми, за исключением того, что ИЛ в методах несколько отличался, и на каждом из них распространялись NOP. Код C # был почти идентичен для них, но IL явно отличался. Я попытался использовать ILDasm и сравнить сгенерированный вывод с TortoiseMerge / WinDiff, но у него было так много ложных различий, что это было бесполезно. NOP действительно испортили вывод, поскольку он изменил адреса филиалов и т. Д. И в основном создавал разницу в каждой строке каждого метода.

Итак, я построил небольшой инструмент под названием ILDump . Это лицензия BSD. Он способен обрезать NOP, используя «умное» переименование ярлыков, так что код тот же, но сдвинутый NOP, он не будет распознаваться как разница с помощью программ Diff, а также выводит только значимые метки ( т.е. те, которые разветвляются / переключаются на). Он также может сортировать методы так, чтобы две сборки, которые были «созданы» по-другому, не будут восприниматься как разница.

Это определенно не идеально, он не справляется ни с чем, кроме сбрасывания IL каждого метода, и нет никакой надежды на круговое отключение. Причина, по которой я его создал, заключалась в том, чтобы упростить чтение IL-кода метода (это интеллектуальная маркировка значительно упрощает отслеживание филиалов), и поэтому я мог бы запускать ее через программу TortoiseMerge или WinDiff, и это не говорит о различиях в каждом строка кода.

  • Медленная инструкция jmp
  • Как я могу просмотреть MSIL / CIL, сгенерированный компилятором C #? Почему это называется сборкой?
  • Как сохранить сборки ASP.NET в AppDomain в живых?
  • Visual Studio «Не удалось скопировать» ... во время сборки
  • Ошибка в построении gradleа после обновления Android Studio с log4j
  • В чем разница между MOV и LEA?
  • Как загрузить сборку .NET для операций отражения и впоследствии выгрузить ее?
  • Поиск всех пространств имен в сборке с использованием Reflection (DotNET)
  • Дополнительная информация о макете памяти исполняемой программы (процесса)
  • Размер сборки .NET влияет на производительность?
  • Как получить вывод ассемблера из источника C / C ++ в gcc?
  • Давайте будем гением компьютера.