company_banner

dotPeek 1.1: обновление бесплатного декомпилятора от JetBrains

    Давно мы не выпускали обновлений для декомпилятора.
    А вчера выпустили: dotPeek 1.1 теперь доступен для широкой публики.

    dotPeek 1.1: бесплатный .NET-декомпилятор от компании JetBrains

    Напомним, dotPeek — это бесплатный декомпилятор .NET-сборок, который показывает результирующий код на языке C# и позволяет изучать его с помощью многообразных функций навигации и поиска, что знакомы и, будем надеяться, симпатичны пользователям другого нашего продукта, ReSharper. В частности, в dotPeek можно проводить поиск конкретного типа, символа или члена класса во всех загруженных сборках; переходить от деклараций символов к их использованиям и наоборот; анализировать иерархии наследования. Кроме того, при наличии файлов отладочной информации (.pdb) dotPeek показывает оригинальный исходный код сборок и дружит с серверами символов, такими как Microsoft Reference Source Center и SymbolSource.org, с которых при необходимости может скачивать исходный код различных библиотек.

    Что касается собственно новой версии, то она может быть интересна .NET-разработчикам по нескольким причинам:
    • dotPeek теперь позволяет экспортировать декомпилированные сборки в проекты (.csproj). Нас об этом долго и убедительно просили, и вот оно, счастье: восстанавливать потерянные исходники по оставшимся библиотекам теперь гораздо проще. Помимо создания проекта и сохранения восстановленного исходного кода в его структуре, dotPeek умеет создавать файлы решений (.sln), воспроизводить структуру папок и файлов на основании отладочной информации, настраивать тип проекта исходя из типа сборки, сохранять историю экспортов и напоминать о том, что та или иная сборка уже была сохранена в виде проекта.
      Экспорт декомпилированной сборки в проект с помощью dotPeek 1.1
    • Логичным образом из первого пункта вытекает второй: файлы проектов (.csproj) и их содержимое теперь можно изучать, не выходя из dotPeek. Это удобно в случаях, когда одна часть изучаемого кода доступна в исходной форме, а другая — только в виде сборок.
    • Декомпиляция BAML — еще одна давно ожидаемая возможность, позволяющая изучать разметку пользовательского интерфейса сборок WPF-приложений.
      Декомпиляция BAML в dotPeek 1.1
    • Появилась поддержка декомпиляции async-методов из последней версии C# 5.0 и деревьев выражений (expression trees) из LINQ. Исправлена декомпиляция событий C#.
    • Навигация по сборкам и их содержимому улучшена за счет введения команды Go to Everything по следам ReSharper 8: она объединяет поиск файлов, типов, членов классов, пространств имен и сборок.
    • Еще в первой версии dotPeek мы постарались перетащить в него максимум релевантной функциональности из ReSharper, но кое-что получилось не сразу. Сейчас наверстываем: в версии 1.1 в декомпиляторе появились закладки, которые (парадоксальным и необъяснимым образом) помогают помечать наиболее интересные строки кода в изучаемых сборках и быстро возвращаться к ним по мере необходимости.
      Закладки в dotPeek 1.1
    • dotPeek научился сохранять состояние окон и списка недавно открытых файлов, и теперь восстанавливает все эти параметры после закрытия и повторного открытия приложения.
    • В дополнение к .msi-инсталлятору dotPeek теперь распространяется в виде автономных 32- и 64-битного .exe-файлов. В связи с появлением этих новых вариантов распространения мы отказались от ранее бытовавшего .zip-дистрибутива.


    Полный список новой функциональности и улучшений в dotPeek 1.1 можно посмотреть здесь.

    Загрузить новую версию декомпилятора можно с нашего официального сайта. Продукт бесплатен, лицензия не требуется: просто берите и работайте.
    JetBrains
    163.03
    Делаем эффективные инструменты для разработчиков
    Share post

    Comments 39

      +4
      Традиционно — буду рад ответить на вопросы про dotPeek (ну и ReSharper до кучи) тут, в комментариях :-)
        0
        Вопрос не ради холивара, а по профессиональной необходимости: для Java в вашей компании что-то такое есть?
          0
          «Что-то такое» — это вы про Java-декомпиляцию? Если да, то подобных продуктов у нас нет (насколько мне известно).
          А вообще для Java у нас есть наша собственная IDE — IntelliJ IDEA.
            +1
            А планируете сделать Java-декомпилятор?
            Ну и Android-декомпилятор до кучи.
              0
              Так, я тут обратился за помощью к IDEA-коллегам, и получил примерно такой ответ:

              Планов на подобные вещи с нашей стороны пока что нет, но есть сторонние плагины для декомпиляции Java

              А вот, что я нашел в IDEA-репозитории: plugins.jetbrains.com/plugin/7100?pr=idea_ce
              Надеюсь, поможет-пригодится.
                0
                Как это — до кучи? У них байт-код разный.
                А вообще да, не хватает тулзы хака андроид-программ.
                Связка dex2jar+jdgui глючная донельзя и часто просто декомпилит некорректно.
              0
              Про декомиляцию естественно. Просто с ростом разных «современных» проектов библиотек, растет и число ошибок в них. Очень ценно было бы создание быстрых патчей на уровне байт-кода. Ну или хотя бы среды в которой можно посмотреть, что конкретно скомпилировано в данный JAR-ник, потому как автор не очень дружит с мейвеном или другой организацией распространения исходников.
              0
              А планируется ли отображение IL кода декомпилированного?
            +3
            К сожалению, иногда читаемость кода на выходе по-прежнему значительно уступает рефлектору.
            Кусок метода SubtitleImage.CreateSubtitleArray из проекта SupRip,
            Как его выдает Reflector
             for (int i = 0; i < this.subtitleBitmap.Size.Height; i++)
                {
                    for (int j = 0; j < this.subtitleBitmap.Size.Width; j++)
                    {
                        byte num4 = (byte) ((((destination[num++] + destination[num++]) + destination[num++]) * destination[num++]) / 0x300);
                        if (num4 < 30)
                        {
                            this.subtitleArray[i, j] = 0;
                        }
                        else
                        {
                            this.subtitleArray[i, j] = num4;
                        }
                    }
                }
            


            И как dotPeek 1.1
                  for (int index1 = 0; index1 < this.subtitleBitmap.Size.Height; ++index1)
                  {
                    for (int index2 = 0; index2 < this.subtitleBitmap.Size.Width; ++index2)
                    {
                      byte[] numArray1 = destination;
                      int index3 = num1;
                      int num2 = 1;
                      int num3 = index3 + num2;
                      int num4 = (int) numArray1[index3];
                      byte[] numArray2 = destination;
                      int index4 = num3;
                      int num5 = 1;
                      int num6 = index4 + num5;
                      int num7 = (int) numArray2[index4];
                      int num8 = num4 + num7;
                      byte[] numArray3 = destination;
                      int index5 = num6;
                      int num9 = 1;
                      int num10 = index5 + num9;
                      int num11 = (int) numArray3[index5];
                      int num12 = num8 + num11;
                      byte[] numArray4 = destination;
                      int index6 = num10;
                      int num13 = 1;
                      num1 = index6 + num13;
                      int num14 = (int) numArray4[index6];
                      byte num15 = (byte) (num12 * num14 / 768);
                      this.subtitleArray[index1, index2] = (int) num15 >= 30 ? num15 : (byte) 0;
                    }
                  }
            


            Пожалуй, главный (единственный?) недостаток в проекте для меня.
            Спасибо за Go to Everything, удобно иметь его и здесь.
              +6
              Большое спасибо! Я завел issue в YouTrack по этому поводу: youtrack.jetbrains.com/issue/DOTP-5719
                0
                Согласен. Попробовал на своем проекте. Самые часто встречаемые проблемы — это огромное количество избыточных операций приведения типов (особенно в случае с лямбдами) и отсутствие распознавания extension-методов. Также обратил внимание на повсеместное явное использование this при обращении к экземплярным полям — но это мелочи.

                С нетерпернием жду новой версии :)
                  0
                  Update: в некоторых местах вылезли сообщения:
                  // ISSUE: explicit reference operation
                  // ISSUE: variable of a reference type
                  

                  Еще в одном месте появился оператор goto.

                  Если интересно, могу прислать примеры исходного кода, который это вызывает.
                    0
                    Кстати да, не хватает ReduceTypesCastingTransformation )))
                    0
                    А вы не могли бы попробовать еще и последний ILSpy? (придется собрать из исходников на github).
                    Интересно сравнить с dotPeek и Reflector.
                      +1
                      Клёво, да
                      	for (int i = 0; i < this.subtitleBitmap.Size.Height; i++)
                      	{
                      		for (int j = 0; j < this.subtitleBitmap.Size.Width; j++)
                      		{
                      			byte b = (byte)((int)((array[num++] + array[num++] + array[num++]) * array[num++]) / 768);
                      			if (b < 30)
                      			{
                      				this.subtitleArray[i, j] = 0;
                      			}
                      			else
                      			{
                      				this.subtitleArray[i, j] = b;
                      			}
                      		}
                      	}
                      


                      Спасибо за наводку на проект, не знал о нем.
                        0
                        А вы не могли бы ещё сравнить с Telerik's JustDecompile?
                          +1
                          Да без проблем
                                      for (int i = 0; i < this.subtitleBitmap.Size.Height; i++)
                                      {
                                          for (int j = 0; j < this.subtitleBitmap.Size.Width; j++)
                                          {
                                              int num1 = num;
                                              num = num1 + 1;
                                              int num2 = num;
                                              num = num2 + 1;
                                              int num3 = num;
                                              num = num3 + 1;
                                              int num4 = num;
                                              num = num4 + 1;
                                              byte num5 = (byte)((numArray[num1] + numArray[num2] + numArray[num3]) * numArray[num4] / 768);
                                              if (num5 >= 30)
                                              {
                                                  this.subtitleArray[i, j] = num5;
                                              }
                                              else
                                              {
                                                  this.subtitleArray[i, j] = 0;
                                              }
                                          }
                                      }
                          


                          Лично мне версия от ILSpy понравилась больше всех.
                        0
                        Он доступен и в качестве инсталлятора ))
                      +3
                      А планируется ли поддержка отображения IL кода в dotPeek? Reflector очень удобен тем, что можно переключаться между декомпилированным кодом и его IL-эквивалентом.
                        0
                        Кстати, да. Приходится грузить ILSpy для этих целей )
                          0
                            0
                            Отлично! А не подскажете, есть какие-нибудь примерные планы по срокам на эту задачу? Сколько осталось ждать до получения этой прекрасной функциональности? А то issue лежит в системе уже два года…
                              0
                              Ну, ничего кроме как «запланировано на версию 2.0», к сожалению, ответить не могу — у нас еще нет конкретных сроков/дат… То, что IL хотят — мы знаем, да, так что обязательно сделаем! :-)
                                0
                                Ок, будем ждать. Спасибо вам за такой чудесный продукт =)
                                  0
                                  Вам спасибо!
                          +14
                          декомпилировал сам dotPeek, получив солюшен )) Чувствую себя злым гением ))
                            +2
                            А скомпилиировать этот солюшен и запустить у вас получилось?
                            0
                            Очень приятная фича Reflector — отладка по декомпиленым исходникам. Нету ли планов реализовать это в dotPeek/ReSharper?
                              +4
                              В dotPeek — нет, поскольу он никак не интегрируется с Visual Studio.
                              В ReSharper — есть, но не ранее 9.0
                              0
                              Я понимаю что Вы не связанны с отделом маркетинга, но всё же:
                              Планируются ли в скором времени какие-то распродажи и акции? А то я уже довольно давно с грустью поглядываю на ваши PhpStorm и IntelliJ IDEA (я пользуюсь комьюнити едишн, но хотел-бы вас поддержать купив лицензию)
                              Увы цены как для скромного сотрудника колледжа(трудовой я записан как инженер-электронщик, хотя и имею часы) не подьёмные.
                                0
                                У JB пару раз в год какая-нибудь фишка с дикой скидкой точно бывает + бесплатные лицензии для open-source некоммерческих проектов, емнип.
                                  0
                                  Ну их требованиям опен-сорс я не соответствую, програмирую в основном Just For Fun. Вот о такого рода акции я и спрашиваю, т.к. уже довольно давно её жду и жалею что на прошлой не скупился. Если нет — попробую подать запрос на академическую лицензию, но всё портит то что основная должность у меня — инженер :(
                                  0
                                  Здравствуйте!
                                  Забавно, но я имею самое непосредственное отношение к маркетингу: я один из marketing lead-ов в JetBrains )
                                  Отвечая на ваш вопрос, серьезные распродажи в ближайшее время не планируются (ну а если бы и планировались, мы бы об этом разве что намекали, да и то только за несколько дней до). Мы с ними несколько переборщили за последний год, хотелось бы перевести дух.
                                  Сейчас действует 10% скидка на персональные лицензии IntelliJ IDEA, но серьезной распродажей я бы это не назвал — скорее способ пощупать эластичность спроса с очередной стороны.
                                  Это были плохие новости. Теперь хорошие.
                                  Если посмотреть на лицензионные соглашения на PhpStorm и IntelliJ IDEA, то там есть параграф 1b, который гласит:
                                  (b) «Licensee» means (i) the individual who is a student, faculty or staff member at an educational institution, or (ii) the educational institution specified in the License Certificate. For purposes of this definition, «educational institution» means a public or private school, college, university and other post secondary educational establishment.

                                  Обратите внимание на cловосочетание «staff member» — даже выступая в роли инженера, а не преподавателя, вы вполне можете быть лицензиатом по академическому соглашению. При этом, как следует из дальнейшего текста соглашения, лицензия должна использоваться в некоммерческих целях, но это, как я понимаю, также выполнимое для вас условие.
                                  Поэтому я не вижу никаких препятствий для подачи заявок на академические лицензии с вашей стороны.
                                  И еще: большое спасибо, что хотите нас поддержать. Это важно и приятно. Правда.
                                    0
                                    Большое спасибо, подал заявку на академическую лицензию на PhpStorm(для начала) с нетерпением буду ждать ответа :)
                                  +1
                                  Немного не в тему, но я не могу удержаться. Когда JetBrains объявит, ну хоть примерную, дату релиза С++ IDE?
                                    +2
                                    Финальный релиз случится вряд ли раньше зимы. Впрочем, в сентябре или октябре мы намерены открыть Early Access Program.
                                    0
                                    Не хватает функционала как в reflexil для Reflector

                                  Only users with full accounts can post comments. Log in, please.