Альтернативы отражателю с открытым исходным кодом? [закрыто]

419

Просто спросить, знает ли кто-нибудь альтернативу RedGate's Reflector с открытым исходным кодом ? Мне интересно узнать, как на самом деле работает инструмент, похожий на Reflector.

Обратите внимание: если вам известна бесплатная, но не открытая альтернатива Reflector, вы можете ответить на следующий связанный вопрос:

Резюме - Обновлено 11 мая 2011

Краткий обзор различных проектов и инструментов с открытым исходным кодом, которые были предложены:

  1. Общая инфраструктура компилятора (CCI)
  2. Моно Сесил
  3. ILSpy
  4. dnSpy (форк ILSpy, проект выглядит более активным, чем оригинальный)
  5. Dotnet IL Editor (DILE)
  6. IL.View
  7. Монофлектор ( больше не активен с апреля 2011 года)

Также могут представлять интерес следующие ресурсы:

  • TypeView.cs
  • Заметки Джейсона Хейли о разборке .NET
  • Недавнее сообщение в блоге Adrian Bank, в котором кратко изложены некоторые альтернативы Reflector, включая несколько вариантов, не упомянутых ниже.
  • Подробный пост Марка Лихтенберга, в котором сравниваются некоторые альтернативы с открытым исходным кодом (DILE, ILSpy и Mono Cecil с использованием MonoDevelop) с Reflector.
MagicAndi
источник
2
К вашему сведению, теперь есть версия v6, которая будет бесплатной на неопределенный срок
thecoop
возможная копия чего- то лучше, чем .NET Reflector?
Мат
2
@Matt, если вы проверите даты, этот вопрос был задан до «Что-то лучше, чем .NET Reflector»? вопрос. Кроме того, этот вопрос специально задает альтернативы с открытым исходным кодом.
MagicAndi

Ответы:

31

2 варианта, которые я знаю.

Это не даст вам C #, хотя.

leppie
источник
Леппи, спасибо. Я принимаю это как ответ, хотя это был трудный выбор между твоим ответом и ответом Джейсона Хейли.
MagicAndi
У CCI нет интерфейса GUI (о котором я знаю). Но в текущем источнике в codeplex есть довольно простой API для преобразования декомпилированного AST в C #, к вашему сведению.
justin.m.chase
2
Mono.Cecil - это просто библиотека, верно?
Роберт Джеппезен
175

Обновлено 13 декабря 2011

Доступны следующие инструменты с открытым исходным кодом:

MagicAndi
источник
1
Я использовал dile несколько лет назад - это отличный дизассемблер И отладчик - я очень рекомендовал его обратно, когда использовал его. Я не использовал это некоторое время, хотя.
Джейсон Хейли
8
Текущая версия ILSpy (ILSpy v1.0.0.440, 20010228) работает так, как я ожидал. Я могу просматривать методы, свойства и даже исходный код для C # lib без файла PDB.
mathijsuitmegen
6
Просто начал использовать ILSpy. Очень доволен этим до сих пор. Идеальная замена. Спасибо SharpDevelop!
codemonkey
1
Просто наткнулся на этот инструмент, очень рад видеть замену скрепки в поясе инструментов разработчика .NET. Некоторые декомпиляции немного странные (конкатенация строк отображается так, как ее видит IL, но не обязательно, как написан код - неплохая вещь), но в целом отличный инструмент!
CodeMonkey1313
5
Я только что попробовал ILSpy, и он отлично работает! Он даже реконструирует лямбда-выражения и методы итератора ("yield return") ... вау! Я впечатлен!
Qwertie
38

Еще одна замена будет dotPeek . JetBrains объявил это как бесплатный инструмент. Вероятно, он будет иметь больше возможностей при использовании с их Resharper, но даже если он используется один, он работает очень хорошо.

Пользовательский опыт больше похож на MSVS, чем на отдельный дизассемблер. Мне нравится читать код больше, чем в Reflector. Навигация по Ctrl + T мне тоже подходит. Синхронизация дерева с панелью кода может быть лучше.

В общем, он все еще находится в разработке, но уже очень пригоден для использования.

Фердинанд Прантл
источник
2
Отличный инструмент, но не с открытым исходным кодом. Это бесплатно, однако, это может означать, что он крадет центр внимания из любого эквивалента с открытым исходным кодом.
Дрю Ноакс
Фердинанд, -1 для инструмента с закрытым исходным кодом. Попробуйте добавить это к одному из связанных вопросов для Reflector.
MagicAndi
3
Я оставляю здесь свой ответ, чтобы сделать информацию более полной. Эту тему проще всего найти в Google, а список других инструментов здесь является наиболее полным. (Между прочим, не все из них OSS.)
Фердинанд Прантл
Фердинанд, я последовательно опускал все ответы, которые дают решения с закрытым исходным кодом, неоднократно обновлял текст вопроса, чтобы указать, что я заинтересован только в OSS, и убедился, что все решения в резюме вопроса имеют открытый исходный код. В этой теме есть только одно решение с закрытым исходным кодом, за которое я также проголосовал. Этот вопрос был задан до того, как решение Redgate отозвалось ранее в этом году, и, в частности, просит об альтернативах с открытым исходным кодом. Что еще мне нужно сделать?
MagicAndi
9
@MagicAndi Стоп жаловаться будет началом. Я нашел эту ветку от Google, когда искал бесплатную альтернативу. Меня не волнует, с открытым исходным кодом или нет. @Ferdin и спасибо за ссылку dotPeek, выглядит многообещающе.
Уинстон Смит
15

Сегодня Telerik выпустил бета-версию собственного инструмента декомпиляции JustDecompile . Закрытый источник, но бесплатный и выглядит многообещающе.

Рэй Гловер
источник
Рэй, извиняюсь, но чтобы соответствовать подходу к ответу Серого Волка, мне придется понизить этот ответ. Этот вопрос специально для альтернатив с открытым исходным кодом. Сообщество .NET позволило себе войти в этот беспорядок, полагаясь на решение с закрытым исходным кодом; мы должны избегать этого в будущем, независимо от того, кто предоставляет инструмент. -1
MagicAndi
Рэй, оказывается, мое предложение Kaliro также является утилитой с закрытым исходным кодом. Пожалуйста, не стесняйтесь ответить взаимностью - я это заслужил! К сожалению, вы не можете голосовать за свои собственные ответы, либо вверх, либо вниз.
MagicAndi
1
@MagicAndi - было бы легче удалить свой ответ, чем понизить его. Если вы не чувствуете, что это добавляет какую-либо ценность, то у вас есть сила, чтобы заставить "уйти".
jpierson
1
Не удаляйте / отрицайте этот ответ. Другие SO вопросы о бесплатных альтернативах закрываются модераторами как «дубликаты» этого вопроса! так что информация стоит того, чтобы быть здесь.
Алекс
JustDecompile - это постыдно глючное приложение, которое постоянно вылетает и показывает множество исключений, где должен быть код. Кроме того, это очень медленно. .NET Reflector НАМНОГО лучше, чем это дерьмо!
Elmue
12

ILSpy отлично работает!

Насколько я могу судить, он делает все то же, что и Reflector, и выглядит так же.

обкрадывать
источник
10

На самом деле, я уверен, что Reflector считается дизассемблером с некоторыми функциями декомпилятора. Дизассемблер, потому что он считывает байты из файла сборки и преобразует его в язык ассемблера (в данном случае ILasm). Функциональность декомпилятора, которую он обеспечивает, анализируя IL в хорошо известные шаблоны (например, выражения и операторы), которые затем переводятся на языки более высокого уровня, такие как C #, VB.Net и т. Д. Apin-модуль add для Reflector позволяет вам писать свой собственный языковой переводчик, если Вы хотите ... однако магия того, как он разбирает IL на деревья выражений, является тщательно охраняемым секретом.

Я бы порекомендовал взглянуть на любую из трех вещей, упомянутых выше, если вы хотите понять, как работают дизассемблеры IL: Dile, CCI и Mono - хорошие источники для этого материала.

Я также настоятельно рекомендую получить спецификацию Ecma 335 и книгу Сержа Лидина.

Джейсон Хейли
источник
эта ссылка кажется неработающей
Lyra
Да, извините, я снял этот сайт в прошлом году и не заменил его.
Джейсон Хейли
8

Основная причина, по которой я использовал Reflector (и, как мне кажется, основная причина, по которой его использовали большинство людей), заключалась в его декомпиляторе: он может переводить IL метода обратно в исходный код.

На этот счет Monoflector будет проект для просмотра. Он использует Cecil, который выполняет отражение, и Cecil.Decompiler, который выполняет декомпиляцию. Но Monoflector накладывает пользовательский интерфейс поверх обеих библиотек, что должно дать вам очень хорошее представление о том, как использовать API.

Monoflector также является достойной альтернативой Reflector. Он позволяет вам просматривать типы и декомпилировать методы, что составляет 99% от того, для чего люди использовали Reflector. Это очень грубо по краям, но я думаю, что это быстро изменится.

Джо Уайт
источник
5

Что ж, Reflector сам по себе является сборкой .NET, поэтому вы можете открыть Reflector.exe в Reflector, чтобы проверить, как он построен.

Эндрю Хэйр
источник
14
Нет, ты не можешь. Отражатель запутан.
Джефф Йейтс
14
Вы не можете открыть Reflector в Reflector? Я только что сделал это - запутывание просто ухудшает читаемость IL, поскольку идентификаторы и имена типов искажены, но это не значит, что вы не можете разбить его.
Эндрю Харе
13
Андрей - когда в яме, перестань копать ...
MagicAndi
2
Хм ... У меня версия 5.1.6.0, и я прекрасно вижу источник - только имена идентификаторов запутаны. Не идеально да, но я сейчас смотрю на C # источник Reflector. :)
Андрей Харе
7
@ Andrew Hare: Если вы попытаетесь посмотреть на реализации методов через отражатель в отражателе, вы увидите «Это запутано», и это не будет отображаться, так что нет, вы не можете использовать Reflector. Кроме того, быть педантичным в отношении того, чего хочет ОП от ОП, - это проигрышная битва.
Джефф Йейтс
3

В настоящее время я работаю над дизассемблером / декомпилятором с открытым исходным кодом, который называется Assembly Analyzer. Он генерирует исходный код для методов, отображает метаданные сборки и ресурсы, а также позволяет просматривать зависимости.

Проект размещен на CodePlex => http://asmanalyzer.codeplex.com/

Codewhisperer84
источник
1

Инструмент «Отражатель» использует «Отражение».  - видимо это не правильно.

Вы просили две вещи - код, который показывает, что делает рефлектор, а также альтернативу рефлектору.

Вот пример, значительно упрощенный по сравнению с тем, что делает Reflector, но он показывает технику отражения: сравнению TypeView.cs

У меня нет предложений по замене рефлектора с открытым исходным кодом.

Cheeso
источник
Хм, если с помощью «Отражения» вы ссылаетесь на «System.Reflection» .NET Framework, я бы очень сомневался в этом.
Christian.K
3
@ Christian.K: Нет, Reflector не использует System.Reflectionв фреймворке, как заметил Редер очень рано из-за проблем с загрузкой и выгрузкой сборок.
casperOne
@casperOne, я не знаю точно, как .NET Reflector работает внутри, но System.Reflectionпространство имен было расширено с первых дней .NET Reflector. Теперь он поддерживает загрузку и выгрузку сборок в контексте только для отражения: stackoverflow.com/questions/225330/…
Drew Noakes
1
@Drew Noakes: Это правда, но Редер никогда не заявлял (насколько мне известно), что он вернулся в Reflection после того, как было сделано это изменение.
casperOne