Я играю вокруг с API Reflection C#. Я могу легко загрузиться Type
информация классов, методы и т.д. в блоке, однако, теперь интересно, как я могу загрузить и прочитать код в методе?
Основной ответ:
Вы не можете использовать API отражения (System.Reflection).
Причина в том, что api отражения разработан для работы с метаданными (тип классов, имя и подпись методов, ...), но не на уровне данных (которым может быть сам поток IL).
Расширенный ответ:
Вы можете генерировать (но не читать) IL с помощью System.Reflection.Emit (например, ILGenerator Class).
Через MethodInfo.GetMethodBody ()
вы можете получить двоичный IL-поток для реализации метода. Но это обычно само по себе совершенно бесполезно.
Существуют внешние библиотеки (например, Cecil ), которые вы можете использовать для чтения / изменения / добавления / удаления кода внутри метода.
Вы вроде можете. Соответствующая функция - MethodBase.GetMethodBody .
Это не самый полезный API. Вы можете получить основную информацию о том, что находится внутри метода, и вы можете получить IL в виде байтового массива. Вот об этом.
В библиотеке Mono.Cecil есть немного лучший API, который предоставляет класс MethodDefinition
с собственной реализацией MethodBody
, которая содержит фактические инструкции
, поэтому вам не нужно интерпретировать необработанный байтовый код. Тем не менее, если вы хотите извлечь из него код C # а-ля Reflector, вы будете сильно разочарованы.Кроме того, Сесил не очень хорошо задокументирован.
Если еще хочешь попробовать, тогда удачи.
Это зависит от того, что вы имеете в виду под прочтением кода. Есть 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
Нет
Это функция, запланированная для следующей версии C #. Вы можете использовать CodeDom, чтобы получить больше информации, чем отражение, но вы пока не можете опросить дерево синтаксического анализа.
Ну, всегда есть моно, в моно компилятор - это служба, и вы можете получить деревья синтаксического анализа во время выполнения.
Лучше спросить, зачем вам это нужно?
Да, должен быть способ добиться этого: инструмент .NET Reflector тоже делает это. Но не могу сказать, как это там делается.
Если вам не нужно делать это в реальном времени, взгляните на Reflector . Вы можете дизассемблировать любую сборку .NET (включая библиотеки DLL ядра MS) и просмотреть код на выбранном вами языке. Это может быть очень образовательным.
Обновление Кто-нибудь пробовал использовать Reflector на Reflector, чтобы выяснить, как это делается?