Сравнить скомпилированные сборки.NET?
Есть ли хорошие программы для сравнения сборок.NET?
Например, у меня HelloWorld.dll (1.0.0.0) и HelloWorld.dll (2.0.0.0), и я хочу сравнить различия, как я могу это сделать?
Я знаю, что могу использовать.NET Reflector и использовать плагин Assembly Diff. Есть ли другие хорошие инструменты для этого?
7 ответов
Способы сравнения.NET сборок предлагает
Коммерческий:
Свободно:
- JustAssembly
- BitDiffer
- Reflector Diff Add-in (который вы уже обнаружили)
Два пути.
Вы могли бы ILDASM и diff с классическими инструментами.
Или вы можете использовать NDepends, который будет стоить для этой функции.
[Кусок на C# раздутых..]
Мне просто нужно было сравнить две ревизии одной и той же DLL, которая имела одинаковую версию (мне нужно было внедрить небольшое исправление и развернуть DLL в производственной среде, но я хотел убедиться, что другие изменения не попали в код). В идеале я хотел бы, чтобы надстройка Assemby Diff показала мне разницу, но она не работает (она думает, что я сравниваю DLL с самой собой). Так вот что я сделал:
- Созданы две папки для хранения разобранных исходных файлов.
- Использовал опцию " Reflector's Export" (из контекстного меню) для генерации исходных файлов из каждой библиотеки DLL в папках, созданных на предыдущем шаге.
- Использовал бесплатный инструмент DiffMerge для сравнения двух каталогов; инструменты показали мне измененные файлы и разницу.
Это немного глупо, но, кажется, работает. Хотелось бы, чтобы надстройка Assembly Diff работала.
ОБНОВЛЕНИЕ: последняя версия надстройки Assembly Diff должна исправить проблему сравнения двух версий одной и той же сборки. Попробуйте.
Инструмент NDepend предлагает множество функций для обработки различий.NET кода. Отказ от ответственности: я один из разработчиков инструмента.
Панель " Поиск по изменению" предназначена для просмотра различий кода сборки. Заметить, что:
- Вы можете подключить к NDepend любой инструмент сравнения кода, используемый в меню. Сравнить старую и более новую версию исходного файла.
- Если у вас нет исходного кода, только необработанные сборки, есть опция Сравнить старую и более новую версию, разобранную с помощью Reflector
Обратите внимание также на скриншот, что для просмотра различий генерируется запрос кода CQLinq.
from m in Application.Methods
where m.CodeWasChanged()
select new { m, m.NbLinesOfCode }
По умолчанию предлагаются многие другие стандартные запросы и правила diff, которые позволят вам разумно просматривать различия в кодах.NET.
- Типы, которые раньше были покрыты на 100%, но не более
- Изменения API: Методы
- Избегайте делать сложные методы еще более сложными
- Избегайте уменьшения покрытия кода тестами типов
- Отныне все добавленные или переработанные типы должны соответствовать основным принципам качества
- Избегайте преобразования неизменяемого типа в изменяемый
- Эвристический поиск типов, перемещенных из одного пространства имен или сборки в другое
Еще один вариант - LibCheck от Microsoft.
Довольно старый консольный инструмент для получения публичного API diff. Я не мог работать без отладки и ретаргетинга на более свежую версию.net. Тем не менее, это дало мне очень четкий вывод, и я собираюсь использовать его позже.
Вот статья со скриншотами.
Вот нестандартный подход, который отлично работает.
Скидывайте свои старые и новые сборки с помощью dnSpy, dotPeek или JustDecompile в проекты.
Создайте новый репозиторий Git и сначала зафиксируйте старый код сборки.
В вашей локальной папке репо удалите все файлы/папки, кроме «.git», и вставьте новые файлы сборки.
Либо зафиксируйте новые изменения и просмотрите изменения, скажем, на Github, либо используйте средство просмотра Git, например Fork. Простое сравнение кода бесплатно.