Поделиться через


Сценарии применения порожденного отражения

Обновлен: Ноябрь 2007

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

Выполнение сценария в веб-обозревателе

В этом сценарии веб-обозреватель загружает HTML-страницу, содержащую программу сценария, а затем выполняет ее. Этапы выполнения сценария.

  1. Веб-обозреватель запускает обработчик сценариев в домене приложения веб-обозревателя.

  2. Веб-обозреватель выделяет сценарий из HTML-страницы и передает его в обработчик сценариев.

  3. Обработчик сценариев создает временную динамическую сборку.

  4. Обработчик сценариев использует интерфейсы API порожденного отражения для порождения кода в динамическую сборку.

Выполнение сценария на странице ASP.NET

В этом сценарии обозреватель открывает страницу ASP.NET, содержащую программу сценария. Программа компилируется на сервере и выполняется. Этапы выполнения сценария.

  1. ASP.NET запускает свой домен приложения и обработчик сценариев, чтобы скомпилировать и выполнить программу.

  2. Обработчик сценариев создает постоянную динамическую сборку и постоянный динамический модуль в этой сборке.

  3. Обработчик сценариев компилирует программу, используя API отражательной эмиссии, и эмитирует код в постоянный динамический модуль.

  4. Скомпилированный код выполняется, в ходе выполнения встречается выражение eval.

  5. Обработчик сценариев создает в динамической сборке временный динамический модуль, в котором содержится код для выражения eval.

  6. Обработчик сценариев вычисляет выражение eval, выполняя соответствующий временный динамический модуль.

  7. ASP.NET обращается к обработчику сценариев с запросом о сохранении динамической сборки и временного динамического модуля в кэше, чтобы больше не требовалась новая компиляция сценария при новом посещении данной страницы.

Компиляция регулярного выражения с использованием порожденного отражения

В этом сценарии компилятор использует порожденное отражение для компиляции регулярных выражений в исходном коде. Пользователь может объявить, какое регулярное выражение следует скомпилировать. Ниже приводятся этапы выполнения сценария.

  1. Компилятор обрабатывает первое использование регулярного выражения в исходном коде пользователя.

  2. Компилятор компилирует регулярное выражение в пользовательский класс сканера с использованием порожденного отражения, поскольку пользователь потребовал выполнить компиляцию этого выражения. Сначала это регулярное выражение транслируется в коды операций регулярного выражения компилятора. Например, одна из инструкций может быть следующей: "попробовать сопоставить от нуля букв а". Затем коды операции регулярного выражения транслируются в язык MSIL. Например, компилятор может создать цикл, в котором осуществляется обход всех найденных вхождений буквы "а".

  3. Компилятор сохраняет скомпилированный класс сканера для будущего использования.

  4. Компилятор создает экземпляр скомпилированного класса сканера и выполняет код в текущем домене приложения.

  5. Компилятор обрабатывает следующее использование того же регулярного выражения в исходном коде пользователя.

  6. Компилятор ищет скомпилированный класс сканера для регулярного выражения, создает его и выполняет код в текущем домене приложения.

Пользователь сталкивается с падением производительности при использовании первого экземпляра регулярного выражения, поскольку компилятор должен скомпилировать это выражение в класс сканера. Однако последующее применение того же регулярного выражения оказывается очень эффективным. Для часто используемых регулярных выражений однократное снижение производительности не играет существенной роли, поскольку оно компенсируется значительным уменьшением времени выполнения.

См. также

Другие ресурсы

Предоставление динамических методов и сборок

Регулярные выражения в .NET Framework

Использование порожденного отражения