汽车 窗口显示表达式 (如范围的变量和参数,当正在调试的程序暂停时 (因为断点或异常)。 表达式可以包含在局部范围已更改的变量,本地或全局和参数。 汽车 窗口还包括类、结构,或某些其他类型的实例化。 表达式计算器能够计算的任何在 汽车 窗口可能会显示。
托管包框架 (MPF)不提供用于 汽车 窗口直接支持。 但是,在中,如果重写 GetProximityExpressions 方法,可以返回在 汽车 窗口将显示的表达式的列表。
实现为 " 自动 " 窗口支持
您需要执行支持 汽车 窗口中的任何是在 LanguageService 类的 GetProximityExpressions 方法。 实现必须决定将源文件的位置,表达式应出现在 汽车 窗口。 方法返回每个字符串表示单个表达式字符串的列表。 S_OK 的返回值指示列表包含表达式,,而 S_FALSE 意味着未显示的表达式。
返回的实际表达式是于代码中的该位置显示变量或参数的名称。 这些名称传递给表达式计算器获取在 汽车 windows 然后显示的值和类型。
示例
下面的示例演示如何使用分析原因 Autos,从 ParseSource 方法获取表达式列表 GetProximityExpressions 方法的实现。 实现 IVsEnumBSTR 接口的每一个表达式包装为 TestVsEnumBSTR 。
请注意 GetAutoExpressionsCount 和 GetAutoExpression 方法是在 TestAuthoringSink 对象的自定义方法和添加支持此示例。 它们表示表达式添加到 TestAuthoringSink 对象由则分析器的一种方法 (通过调用 AutoExpression 方法) 可以在该分析器外部访问。
using Microsoft.VisualStudio;
using Microsoft.VisualStudio.Package;
using Microsoft.VisualStudio.TextManager.Interop;
namespace TestLanguagePackage
{
public class TestLanguageService : LanguageService
{
public override int GetProximityExpressions(IVsTextBuffer buffer,
int line,
int col,
int cLines,
out IVsEnumBSTR ppEnum)
{
int retval = VSConstants.E_NOTIMPL;
ppEnum = null;
if (buffer != null)
{
IVsTextLines textLines = buffer as IVsTextLines;
if (textLines != null)
{
Source src = this.GetSource(textLines);
if (src != null)
{
TokenInfo tokenInfo = new TokenInfo();
string text = src.GetText();
ParseRequest req = CreateParseRequest(src,
line,
col,
tokenInfo,
text,
src.GetFilePath(),
ParseReason.Autos,
null);
req.Scope = this.ParseSource(req);
TestAuthoringSink sink = req.Sink as TestAuthoringSink;
retval = VSConstants.S_FALSE;
int spanCount = sink.GetAutoExpressionsCount();
if (spanCount > 0) {
TestVsEnumBSTR bstrList = new TestVsEnumBSTR();
for (int i = 0; i < spanCount; i++)
{
TextSpan span;
sink.GetAutoExpression(i, out span);
string expression = src.GetText(span.iStartLine,
span.iStartIndex,
span.iEndLine,
span.iEndIndex);
bstrList.AddString(expression);
}
ppEnum = bstrList;
retval = VSConstants.S_OK;
}
}
}
}
return retval;
}
}
}