Как можно прочитать полный исходный код из .dll? - PullRequest
0 голосов
/ 02 ноября 2010

Наша команда разработала Инструмент, который используется, чтобы найти ссылку на Измененный метод в Проекте. 1. Мы использовали отражение, чтобы прочитать пространство имен, имя класса и имя метода e.t.c. 2. Мы начали искать тело метода в файле cs и сохранили в списке. 3. Мы взяли каждый метод для нахождения Справочника Но я видел инструмент отражателя, который читает полный исходный код, используя .dll. Как бы это случилось? Есть ли способ прочитать исходный код из рефлексии? Пожалуйста, помогите мне в этом Заранее спасибо

Ответы [ 2 ]

3 голосов
/ 02 ноября 2010

Reflector на самом деле не читает исходный код - потому что его там нет.Вместо этого он берет IL и декомпилирует его, выясняя, как мог выглядеть исходный код .

Вот так он может показывать вам код на нескольких языках - очевидно, код не 't на самом деле написано (скажем) как на VB, так и на C #, но Reflector может показать вам и то, и другое, выяснив, что делает код, и попытавшись найти исходный код, который будет делать то же самое.(Между прочим, это не всегда успешно. Иногда есть биты IL, которые генерируются компилятором C # из таких вещей, как блоки итераторов или асинхронные методы, где равно , прямой эквивалент недействителенC #.)

0 голосов
/ 02 ноября 2010

На самом деле это многошаговый процесс. Все, что вы получите от DLL или EXE - это байт-код IL, который по сути является абстрактным машинным языком. Этот байт-код IL может быть преобразован один в один в язык ассемблера IL (например, с помощью ILDASM или режима прямого IL Reflector).

Режим декомпилятора языка C # в Reflector продвигается дальше и выбирает структуру из кода, который напоминает циклы if / else, while, операторы switch и т. Д., И переводит его в соответствующие операторы. Информация о именах локальных переменных не сохраняется в IL, поэтому она должна составлять их по мере продвижения; Кроме того, некоторые управляющие структуры могли быть оптимизированы до неузнаваемости, что приводит к созданию операторов goto. Есть также некоторые конструкции, которые не имеют прямых параллелей в языке C #, поэтому вы можете найти неофициальные ключевые слова расширения, такие как methodof в декомпилированном коде.

Интересным упражнением является изучение того, как переводится более новый код C # при декомпиляции в более ранние версии языка. Например, понимания запросов LINQ переводятся как цепочки методов через IEnumerable<T>, а лямбда-выражения, переданные в аргументы Expression<T>, заменяются целой связкой goo для построения и передачи абстрактного синтаксического дерева, соответствующего лямбда-выражению, что фактически во что такие конструкции переводятся компилятором.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...