Я могу использовать отражение для осмотра кода в методе?

Я играю вокруг с API Reflection C#. Я могу легко загрузиться Type информация классов, методы и т.д. в блоке, однако, теперь интересно, как я могу загрузить и прочитать код в методе?

40
задан Sam 7 October 2016 в 19:55
поделиться

6 ответов

Основной ответ:

Вы не можете использовать API отражения (System.Reflection).

Причина в том, что api отражения разработан для работы с метаданными (тип классов, имя и подпись методов, ...), но не на уровне данных (которым может быть сам поток IL).

Расширенный ответ:

Вы можете генерировать (но не читать) IL с помощью System.Reflection.Emit (например, ILGenerator Class).

Через MethodInfo.GetMethodBody () вы можете получить двоичный IL-поток для реализации метода. Но это обычно само по себе совершенно бесполезно.

Существуют внешние библиотеки (например, Cecil ), которые вы можете использовать для чтения / изменения / добавления / удаления кода внутри метода.

35
ответ дан 27 November 2019 в 01:43
поделиться

Вы вроде можете. Соответствующая функция - MethodBase.GetMethodBody .

Это не самый полезный API. Вы можете получить основную информацию о том, что находится внутри метода, и вы можете получить IL в виде байтового массива. Вот об этом.

В библиотеке Mono.Cecil есть немного лучший API, который предоставляет класс MethodDefinition с собственной реализацией MethodBody , которая содержит фактические инструкции , поэтому вам не нужно интерпретировать необработанный байтовый код. Тем не менее, если вы хотите извлечь из него код C # а-ля Reflector, вы будете сильно разочарованы.Кроме того, Сесил не очень хорошо задокументирован.

Если еще хочешь попробовать, тогда удачи.

9
ответ дан 27 November 2019 в 01:43
поделиться

Это зависит от того, что вы имеете в виду под прочтением кода. Есть 4 формы кода.

1- Исходный код, например. исходный C # или VB.NET - Нет, вы не можете получить это с помощью отражения
2- Символьный код IL - Нет, вы не можете получить это с помощью отражения
3- Сборка JITed code - Нет, вы не можете получить это с помощью отражения

4- Байты IL, фактические байты, в которые компилируется IL, вы можете получить .

Взгляните на MethodBase.GetMethodBody (), например, вы можете получить байты IL, локальные переменные, фреймы исключений и т. Д. http://msdn.microsoft.com/en- us / library / system.reflection.methodbase.getmethodbody.aspx

16
ответ дан 27 November 2019 в 01:43
поделиться

Нет
Это функция, запланированная для следующей версии C #. Вы можете использовать CodeDom, чтобы получить больше информации, чем отражение, но вы пока не можете опросить дерево синтаксического анализа.

Ну, всегда есть моно, в моно компилятор - это служба, и вы можете получить деревья синтаксического анализа во время выполнения.

Лучше спросить, зачем вам это нужно?

1
ответ дан 27 November 2019 в 01:43
поделиться

Да, должен быть способ добиться этого: инструмент .NET Reflector тоже делает это. Но не могу сказать, как это там делается.

1
ответ дан 27 November 2019 в 01:43
поделиться

Если вам не нужно делать это в реальном времени, взгляните на Reflector . Вы можете дизассемблировать любую сборку .NET (включая библиотеки DLL ядра MS) и просмотреть код на выбранном вами языке. Это может быть очень образовательным.

Обновление Кто-нибудь пробовал использовать Reflector на Reflector, чтобы выяснить, как это делается?

2
ответ дан 27 November 2019 в 01:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: