计算监视窗口表达式

重要

在 Visual Studio 2015 中,这种实现表达式计算器的方法已弃用。 有关实现 CLR 表达式计算器的信息,请参阅 CLR 表达式计算器托管表达式计算器示例

执行暂停时,Visual Studio 会调用调试引擎 (DE),以确定其监视列表中的每个表达式的当前值。 DE 使用表达式计算器 (EE) 计算每个表达式,Visual Studio 在“监视”窗口中显示其值。

以下是如何计算监视列表表达式的概述:

  1. Visual Studio 调用 DE 的 GetExpressionContext,以获取可用于计算表达式的表达式上下文。

  2. 对于监视列表中的每个表达式,Visual Studio 调用 ParseText,将表达式文本转换为已分析的表达式。

  3. IDebugExpressionContext2::ParseText 调用 Parse 以执行分析文本和生成 IDebugParsedExpression 对象的实际工作。

  4. IDebugExpressionContext2::ParseText 创建 IDebugExpression2 对象并将 IDebugParsedExpression 对象放入其中。 然后,此 IDebugExpression2 对象将返回到 Visual Studio。

  5. Visual Studio 调用 EvaluateSync 以计算分析的表达式。

  6. IDebugExpression2::EvaluateSync 传递对 EvaluateSync 的调用,以执行实际计算并生成 返回到 Visual Studio 的 IDebugProperty2 对象。

  7. Visual Studio 调用 GetPropertyInfo 以获取表达式的值,随后将其显示在监视列表中。

分析,然后计算

由于分析复杂表达式所需的时间比计算表达式长得多,因此计算表达式的过程分为两个步骤:1) 分析表达式,2) 计算分析的表达式。 这样,计算可以发生多次,但表达式只需分析一次。 中间分析表达式从 IDebugParsedExpression 对象中的 EE 返回,该对象又作为 IDebugExpression2 对象封装并从 DE 返回。 IDebugExpression 对象将所有计算延迟到 IDebugParsedExpression 对象。

注意

EE 不必遵循这两个步骤,即使 Visual Studio 假定这一过程;调用 EvaluateSync 时,EE 可以在同一步骤中分析和计算(例如,这是 MyC EE 示例的工作原理)。 如果语言可以形成复杂的表达式,可能需要将分析步骤与计算步骤分开。 当显示许多监视表达式时,这可提高 Visual Studio 调试器的性能。

本节内容

表达式计算的示例实现使用 MyCEE 示例逐步介绍表达式计算过程。

计算监视表达式可解释成功分析表达式后会发生什么情况。