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

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

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

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

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

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

8 ответов

Решение

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

Панель " Поиск по изменению" предназначена для просмотра различий в кодах сборок:


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

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

// <Name>Types that used to be 100% covered but not anymore</Name>
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 }

или также:


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

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

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

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам