понедельник, 6 июня 2011 г.

Незаменимых нет? (или чем заменить .NET Reflector)

Многие знают, что с июня месяца рефлектор стал платным. За неделю до этого события я решил подыскать себе бесплатную альтернативу. Выбирал среди ILSpy, JetBrains dotPeek и Telerik JustDecompile. Около недели я ими пользовался, и свои наблюдения я фиксировал в файлике. Таким образом, у меня появилась небольшая статья, которая, возможно, кому-нибудь облегчит выбор.

С основной задачей – декомпиляцией кода все приложения справляются достаточно хорошо. Поэтому следующим шагом стал выбор наиболее удобной в использовании замены рефлектора и развитость «второстепенного» функционала.

Наиболее важные для меня критерий выбора декомпилятора были следующие:

  1. Удобство работы
  2. Скорость работы (загрузка, поиск типа, декомпиляция)
  3. Функционал
    1. Analyze
    2. Декомпиляция в Visual Basic
    3. Search MSDN
    4. Поиск типа, метода, строки.

Естественно, поскольку, удобство работы, это очень нечеткий критерий, то и вывод мой, что мой вывод будет субъективным.

По скорости работы особых нареканий у меня тоже не оказалось. Точнее все работают приблизительно одинаково медленно ;), разве что Telerik JustDecompile грузится немого медленей других.

А вот по развитости второстепенного функционала продукты отличаются довольно сильно.

К сожалению, на текущий момент ни один из декомпиляторов не поддерживают следующие операции:

  • Поиск строки
  • Поиск выбранного типа в MSDN
  • Поиск выбранного типа в Bing

Однако, что поскольку разработка этих продуктов началась сравнительно недавно (февраль 2011) и еще идет полным ходом, функционал может существенно измениться. Поэтому ниже я привожу версии продуктов, между которыми я выбирал.

Далее я приведу скриншоты декомпиляторово и их краткое описание (отличие).


ILSpy билд 1.0.0.822

image

Очень похож на.NET Reflector. Умеет декомпилировать в C# и IL. Есть приятная функция, которой нет в рефлекторе и в других декомпиляторах – при декомпиляции кода показывает комментарии, что очень удобно.

Единственный из продуктов, который позволяет пометить сразу несколько сборок для удаления.

Telerik JustDecompile Beta билд 2011.1.516.2

image

Минусы начинаются со скачивания инсталлятора – при скачивании требует регистрации. У меня регистрация была, но в противном случае я бы его не стал скачивать.

Интересное совпадение, пока я писал эту статью JustDecompile показал мне уведомление, что есть обновленние, но что бы его скачать надо было опять вводить регистрационные данные. Лень мне стало их искать и обновление не стал скачивать.
Переборщили они с этим.

Немного не типичный интерфейс пользователя из-за чего создается впечатление что у программы Из рассматриваемых продуктов единственный, который на текущий момент умеет декомпилировать в C# и Visual Basic .NET.

Функция Analyze здесь называется Find Usages. Есть проблемы с поиском типов. Почему-то не всегда находит типы, так же не всегда при поиске типов фокус ввода в поле ввода. Мелочь, а неприятно.

JetBrains dotPeek билд 1.0.0.1219

Наиболее глючный и в то же время наиболее функциональный продукт. Регулярно (но не так часто чтобы надоесть) показывает диалог с просьбой отправить детали ошибки. Несколько раз сталкивался с таким багом. Открываю, например, исходники StringBuilder, затем выбираю интерфейс, который он реализует и исходный текст StringBuilder’а пропадает и больше не появляется. Ниже наглядная демонстрация бага.

image

Из существенных ограничений – умеет только декомпилировать в C#.

Для тех, кто пользуется решарпером интерфейс и горячие клавиши будут знакомы. Жаль, но не работает как в решарпере поиск элемента по заглавным буквам. Отличается и немного терминология. Т.е. нет команды Analyze, но есть Find Usages и Find Usages Advanced.

Нет панели инструментов с кнопками навигации (как-то привык я к нему в рефлекторе), чтобы перемещаться по коду вперед-назад надо выбирать пункта Navigate главного меню, что откровенно говоря не удобно. К счастью для этих команд горячие клавиши такие же как и в студии по дефолту.

Автоматически не выделяется текущий тип в дереве (но есть специальная команда ;)).

Как видно из скриншота каждый тип открывается в новой вкладке. Вкладки можно перемещать и прикреплять аналогично тому как это делается в студии.

Из интересных новшеств подметил, что dotPeek умеет подгружать с сайта Майросовт реальный исходный код (как это делает студия), но у меня почему-то это не сработало (возможно, тоже какой-то дефект).

Выводы

Меньше всех понравился JustDecompile. Оставлю только на случай если понадобится декомпиляция в Visual Basic .NET. Между ILSpy и dotPeek окончательный выбор я так пока не сделал. Я хоть и пользусь решарпером и нравится мне продвинутая функциональнось dotPeek, но как-то в большинстве случаев ILSpy пользоваться удобней. Возможно, сказывается привычка к .NET Reflector, а ILSpy больше всего на него похож.

9 комментариев:

Nikolay Osinin комментирует...

Хороший обзор.
При всех недостатках описанных приложений они лучше чем ildasm.

PS. Не хочу занудствовать, но все же декомпилятор от JetBrains называется «dotPeek». :)

Андрей Бороздин комментирует...

Спасибо, Коля, поправил.

Daniil Bystrukhin комментирует...

.NET Reflector 6 is the last free version of .NET Reflector but, unlike previous free editions, it will not expire or force you to update.

Тобишь пока не выйдут полностью адэкватные (субъективно) версии того-же ilspy можно пользоваться.

Андрей Бороздин комментирует...

Откуда это?
Вот что пишет мой рефлектор:

---------------------------
.NET Reflector
---------------------------
This is the last free version of .NET Reflector which will expire May 30. Do you want to download a free 14 day trial of version 7?
---------------------------
Yes No
---------------------------

nd комментирует...

Здравствуйте. А как с вами связаться? Не нашел никаких контактов. Скажите, пожалуйста, можно ли в каком нибудь декомпиляторе исправить код и тупо "Сохранить"? :) Или нужно обязательно ставить студию и в ней пересобирать? Надо кое что перевести) Распаковал рефлектором, вижу, что надо исправить, а редактора тут вроде как нет)

Андрей Бороздин комментирует...

Нет, такой функции я не знаю. Более того если сборка подписана то еще потребуется и strong name key. что-то похожее можно проверуть с помощью ildasm и ilasm, но я бы не сказал, что это тривиальная задача :)

Savichev Alexander комментирует...

https://code.google.com/p/simple-assembly-explorer/
И через опкоды править

Savichev Alexander комментирует...

А вот собсно и описание оных
http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes_fields.aspx

Unknown комментирует...

Будем вам очень благодарны, если оставите свои замечания об ошибках dotPeek в баг-треккере JetBrains http://youtrack.jetbrains.com/issues/DOTP Спасибо!