Архитектура вычислителя выражений

Важно!

В Visual Studio 2015 такая реализация вычислителя выражений была сделана нерекомендуемой. Сведения о реализации вычислителей выражений в среде CLR см. на страницах CLR expression evaluators (Вычислители выражений CLR) и Managed expression evaluator sample (Пример управляемого вычислителя выражений).

Интеграция собственного языка в пакет отладки Visual Studio означает, что необходимо настроить необходимые интерфейсы вычислителя выражений (EE) и вызвать поставщик символов времени выполнения (SP) и интерфейсы привязки. Объекты sp и binder вместе с текущим адресом выполнения — это контекст, в котором вычисляются выражения. Сведения, которые эти интерфейсы создают и используют, представляют основные понятия архитектуры EE.

Анализ выражения

При отладке программы выражения оцениваются по ряду причин, но всегда при отладке программы в точке останова (точке останова, размещенной пользователем или одной из них, вызванной исключением). На данный момент Visual Studio получает кадр стека, представленный интерфейсом IDebugStackFrame2 из подсистемы отладки (DE). Затем Visual Studio вызывает GetExpressionContext , чтобы получить интерфейс IDebugExpressionContext2 . Этот интерфейс представляет контекст, в котором можно оценивать выражения; ParseText — это точка входа в процесс оценки. До этого момента все интерфейсы реализуются DE.

При IDebugExpressionContext2::ParseText вызове DE создает экземпляр EE, связанный с языком исходного файла, где произошла точка останова (DE также создает экземпляр SH на этом этапе). EE представлен интерфейсом IDebugExpressionEvaluator . Затем DE вызывает синтаксический анализ для преобразования выражения (в текстовой форме) в проанализированное выражение, готовое к оценке. Это проанализированное выражение представлено интерфейсом IDebugParsedExpression . Выражение обычно анализируется и не оценивается на этом этапе.

De создает объект, реализующий интерфейс IDebugExpression2 , помещает IDebugParsedExpression объект в IDebugExpression2 объект и возвращает IDebugExpression2 объект из IDebugExpressionContext2::ParseText.

Оценка выражения

Visual Studio вызывает Метод EvaluateSync или EvaluateAsync для оценки синтаксического выражения. Оба этих метода вызывают EvaluateSync (IDebugExpression2::EvaluateSync вызывает метод немедленно, во время вызова метода через IDebugExpression2::EvaluateAsync фоновый поток) для вычисления синтаксического выражения и возврата интерфейса IDebugProperty2 , представляющего значение и тип синтаксического выражения. IDebugParsedExpression::EvaluateSync использует предоставленный SH, адрес и привязку для преобразования синтаксического выражения в фактическое значение, представленное интерфейсом IDebugProperty2 .

Например.

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

При отображении диалогового окна QuickWatch имя проверяемой переменной отправляется как текст в ParseText. При этом возвращается объект IDebugExpression2 , представляющий проанализированное выражение, в данном случае переменная. Затем функция EvaluateSync вызывается для создания IDebugProperty2 объекта, представляющего значение и тип переменной, а также его имя. Это информация, отображаемая.

Если пользователь изменяет значение переменной, метод SetValueAsString вызывается с новым значением, которое изменяет значение переменной в памяти, чтобы она использовалась при возобновлении работы программы.

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

В этом разделе

Контекст оценки предоставляет аргументы, передаваемые при вызове EE de.

Интерфейсы вычислителя ключевых выражений описывают важные интерфейсы, необходимые при написании EE, а также контекст оценки.