为汽车窗口 (托管包结构) 支持

汽车 窗口显示表达式 (如范围的变量和参数,当正在调试的程序暂停时 (因为断点或异常)。 表达式可以包含在局部范围已更改的变量,本地或全局和参数。 汽车 窗口还包括类、结构,或某些其他类型的实例化。 表达式计算器能够计算的任何在 汽车 窗口可能会显示。

托管包框架 (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;
        }
    }
}