Сравнить скомпилированные сборки.NET?

Есть ли хорошие программы для сравнения сборок.NET?

Например, у меня HelloWorld.dll (1.0.0.0) и HelloWorld.dll (2.0.0.0), и я хочу сравнить различия, как я могу это сделать?

Я знаю, что могу использовать.NET Reflector и использовать плагин Assembly Diff. Есть ли другие хорошие инструменты для этого?

7 ответов

Решение

Способы сравнения.NET сборок предлагает

Коммерческий:

Свободно:

Два пути.

Вы могли бы ILDASM и diff с классическими инструментами.

Или вы можете использовать NDepends, который будет стоить для этой функции.

[Кусок на C# раздутых..]

Мне просто нужно было сравнить две ревизии одной и той же DLL, которая имела одинаковую версию (мне нужно было внедрить небольшое исправление и развернуть DLL в производственной среде, но я хотел убедиться, что другие изменения не попали в код). В идеале я хотел бы, чтобы надстройка Assemby Diff показала мне разницу, но она не работает (она думает, что я сравниваю DLL с самой собой). Так вот что я сделал:

  • Созданы две папки для хранения разобранных исходных файлов.
  • Использовал опцию " Reflector's Export" (из контекстного меню) для генерации исходных файлов из каждой библиотеки DLL в папках, созданных на предыдущем шаге.
  • Использовал бесплатный инструмент DiffMerge для сравнения двух каталогов; инструменты показали мне измененные файлы и разницу.

Это немного глупо, но, кажется, работает. Хотелось бы, чтобы надстройка Assembly Diff работала.

ОБНОВЛЕНИЕ: последняя версия надстройки Assembly Diff должна исправить проблему сравнения двух версий одной и той же сборки. Попробуйте.

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

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

  • Вы можете подключить к NDepend любой инструмент сравнения кода, используемый в меню. Сравнить старую и более новую версию исходного файла.
  • Если у вас нет исходного кода, только необработанные сборки, есть опция Сравнить старую и более новую версию, разобранную с помощью Reflector

Поиск по Diff Panel

Обратите внимание также на скриншот, что для просмотра различий генерируется запрос кода CQLinq.

from m in Application.Methods 
where m.CodeWasChanged() 
select new { m, m.NbLinesOfCode }

По умолчанию предлагаются многие другие стандартные запросы и правила diff, которые позволят вам разумно просматривать различия в кодах.NET.

Еще один вариант - LibCheck от Microsoft.

Довольно старый консольный инструмент для получения публичного API diff. Я не мог работать без отладки и ретаргетинга на более свежую версию.net. Тем не менее, это дало мне очень четкий вывод, и я собираюсь использовать его позже.

Вот статья со скриншотами.

Вот нестандартный подход, который отлично работает.

  1. Скидывайте свои старые и новые сборки с помощью dnSpy, dotPeek или JustDecompile в проекты.

  2. Создайте новый репозиторий Git и сначала зафиксируйте старый код сборки.

  3. В вашей локальной папке репо удалите все файлы/папки, кроме «.git», и вставьте новые файлы сборки.

  4. Либо зафиксируйте новые изменения и просмотрите изменения, скажем, на Github, либо используйте средство просмотра Git, например Fork. Простое сравнение кода бесплатно.

У Java есть хороший пример: Semantic Diff Utilities

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