Visual Studio SDK - IViewTagAggregatorFactoryService.CreateTagAggregator 导致异常

Visual Studio SDK - IViewTagAggregatorFactoryService.CreateTagAggregator causes an exception

我需要获取当前文本视图中 ITextSnapshotLine 行的分类标签。

首先,我得到了活动文本视图:

public static IWpfTextView GetTextView()
{
    var textManager = (IVsTextManager)ServiceProvider.GlobalProvider.GetService(typeof(SVsTextManager));
    IVsTextView vTextView = null;
    var mustHaveFocus = 1;
    textManager.GetActiveView(mustHaveFocus, null, out vTextView);
    var userData = vTextView as IVsUserData;
    if (userData != null)
    {
        IWpfTextViewHost viewHost;
        object holder;
        var guidViewHost = DefGuidList.guidIWpfTextViewHost;
        userData.GetData(ref guidViewHost, out holder);
        viewHost = (IWpfTextViewHost)holder;
        var textView = viewHost.TextView;
        return textView;
    }

    return null;
}

然后,我从视图中获取 ITextViewLine 行的集合,并对每个行调用 GetClassificationTags 方法:

GetClassificationTags(new SnapshotSpan(line.Start, line.Length), textView)

该方法如下所示:

public IEnumerable<IMappingTagSpan<IClassificationTag>> GetClassificationTags(SnapshotSpan span, ITextView textView)
{
    var snapshot = textView.TextSnapshot;

    var componentModel = (IComponentModel)ServiceProvider.GlobalProvider.GetService(typeof(SComponentModel));
    var exportProvider = componentModel.DefaultExportProvider;

    var viewTagAggregatorFactoryService = exportProvider.GetExportedValue<IViewTagAggregatorFactoryService>();

    var tagAggregator = viewTagAggregatorFactoryService.CreateTagAggregator<IClassificationTag>(textView);

    return tagAggregator.GetTags(span);
}

因此,我对所有内容进行了正确分类。但是,Visual Studio 抛出异常并将其记录到 ActivityLog.xml 文件中。只有在第一次对所有行进行分类后才会发生这种情况。日志文件中的信息显示:

System.InvalidOperationException:
Unexpected false&#x000D;&#x000A;
at Roslyn.Utilities.Contract.ThrowIfFalse(Boolean condition, String message)&#x000D;&#x000A;
at Microsoft.CodeAnalysis.Editor.Implementation.Diagnostics.AbstractDiagnosticsTaggerProvider`1.CreateTagger[T](ITextBuffer buffer)&#x000D;&#x000A;
at Microsoft.CodeAnalysis.Editor.Implementation.Diagnostics.AbstractDiagnosticsTaggerProvider`1.Microsoft.VisualStudio.Text.Tagging.ITaggerProvider.CreateTagger[T](ITextBuffer buffer)&#x000D;&#x000A;
at Microsoft.VisualStudio.Text.Tagging.Implementation.TagAggregator`1.GatherTaggers(ITextBuffer textBuffer)

我注意到在注释掉下面的行后没有抛出异常:

var tagAggregator = viewTagAggregatorFactoryService.CreateTagAggregator<IClassificationTag>(textView);

有时候,日志文件中也会出现这个异常:

System.InvalidOperationException: Unexpected false&#x000D;&#x000A;
at Roslyn.Utilities.Contract.ThrowIfFalse(Boolean condition, String message)&#x000D;&#x000A;
at Microsoft.CodeAnalysis.Editor.Tagging.AbstractAsynchronousTaggerProvider`1.TagSource.GetTagIntervalTreeForBuffer(ITextBuffer buffer)&#x000D;&#x000A;
at Microsoft.CodeAnalysis.Editor.Tagging.AbstractAsynchronousTaggerProvider`1.Tagger.GetTagsWorker(NormalizedSnapshotSpanCollection requestedSpans, Boolean accurate, CancellationToken cancellationToken)&#x000D;&#x000A;
at Microsoft.CodeAnalysis.Editor.Tagging.AbstractAsynchronousTaggerProvider`1.Tagger.GetTags(NormalizedSnapshotSpanCollection requestedSpans)&#x000D;&#x000A;
at Microsoft.VisualStudio.Text.Tagging.Implementation.TagAggregator`1.&lt;GetTagsForBuffer&gt;d__38.MoveNext()

我的问题是:是什么导致了这个异常,我该如何摆脱它?

The code is open source,大家随便看看。我猜你是在后台线程上尝试的。