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


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

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

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

В этом сценарии веб-обозреватель загружает 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

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

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

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