共用方式為


[自動變數] 視窗 (受管理的封裝架構) 的支援

自動變數 ] 視窗會顯示運算式,例如變數和偵錯程式暫停 (不論受限於中斷點或例外狀況) 時,位於範圍中的參數。 運算式可以包含變數本機或全域和區域範圍中已經變更的參數。 自動變數視窗也可以包括類別、 結構或其他類型的例項化。 任何可以評估的運算式評估工具,可能會顯示在自動變數視窗。

受管理的封裝架構 (MPF) 不會提供直接支援自動變數視窗。 不過,如果您覆寫GetProximityExpressions方法,您可以傳回一連串的運算式,以呈現在自動變數視窗。

實作支援自動變數視窗

您要做為支援自動變數視窗是實作GetProximityExpressions中的方法LanguageService類別。 您的實作必須決定指定的位置,在來源檔案中,運算式應該出現在自動變數視窗。 這個方法會傳回的字串,其中每個字串代表單一的運算式清單。 傳回值為S_OK表示清單內的運算式,而S_FALSE ,即表示沒有要顯示的運算式。

實際傳回的運算式是變數或參數,會出現在程式碼中的該位置的名稱。 這些名稱傳遞給運算式評估工具,來取得值,型別,接著會顯示在自動變數視窗。

範例

下列範例會示範實作GetProximityExpressions取得一份從運算式的方法ParseSource使用剖析原因的方法Autos。 每個運算式包裝成TestVsEnumBSTR實作IVsEnumBSTR介面。

請注意, 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;
        }
    }
}