Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

enter image description here


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

Типы, которые раньше были на 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.

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

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

Ответ 2

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

Ответ 8

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

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

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