1

我在 Visual Studio 2010 中使用托管可扩展性框架 (MEF) 来增强 Visual Studio 本身。具体来说,我在某些情况下会生成错误,以帮助开发人员知道代码何时出现问题。我可以使用 ErrorTag 让红色波浪出现,但错误不会出现在错误列表中。

我注意到当自定义错误出现时,应用程序仍然运行。所以自定义错误实际上并不能阻止开发人员忽略它们并继续他们的快乐方式。本质上,据我所知,ErrorTag 所做的只是创建一个红色波浪形,仅此而已。

有谁知道如何使用 MEF 将错误添加到错误列表中,并在出现自定义错误时阻止应用程序运行?如果它实际上没有向开发人员突出显示,而是直接盯着它,它有点违背了创建错误的目的。下面是代码片段。这些只是寻找一个简单的文本来标记为错误,只是为了保持示例简单和干净。

另外,有没有人有关于扩展视觉工作室的好视频或书籍?我发现的最好的是在 Pluralsight 上,但它仍然只触及表面。

[Export(typeof(ITaggerProvider))]
[ContentType("code")]
[TagType(typeof(ErrorTag))]
class CheckTextErrorProvider : ITaggerProvider
{
    public ITagger<T> CreateTagger<T>(Microsoft.VisualStudio.Text.ITextBuffer buffer) where T : ITag
    {
        if (buffer == null)
        {
            throw new ArgumentException("Buffer is null");

        }
        else
        {
            return new CheckTextErrorTagger() as ITagger<T>;
        }
    }
}


class CheckTextErrorTagger: ITagger<IErrorTag>
{
    private const string _searchText = "checktext";
    public IEnumerable<ITagSpan<IErrorTag>> GetTags(NormalizedSnapshotSpanCollection spans)
    {
        foreach (SnapshotSpan currSpan in spans)
        {
            int loc = currSpan.GetText().ToLower().IndexOf(_searchText);

            if (loc > -1)
            {
                SnapshotSpan CheckTextSpan = new SnapshotSpan(currSpan.Snapshot, new Span(currSpan.Start + loc, _searchText.Length));
                yield return new TagSpan<ErrorTag>(CheckTextSpan, new ErrorTag());
            }
        }
    }

    public event EventHandler<SnapshotSpanEventArgs> TagsChanged
    {
        add { }
        remove { }
    }
}
4

1 回答 1

0

您应该创建一个 ErrorListProvider:

 class ErrorListHelper
{
    public static ErrorListProvider GetErrorListProvider()
    {


        Microsoft.VisualStudio.OLE.Interop.IServiceProvider globalService = (Microsoft.VisualStudio.OLE.Interop.IServiceProvider)Microsoft.VisualStudio.Shell.Package.GetGlobalService(typeof(Microsoft.VisualStudio.OLE.Interop.IServiceProvider));

        System.IServiceProvider serviceProvider = new ServiceProvider(globalService);

        ErrorListProvider mErrorListProvider = new ErrorListProvider(serviceProvider);
        mErrorListProvider.ProviderName = "JS Errors";
        mErrorListProvider.ProviderGuid = new Guid(EnvDTE.Constants.vsViewKindCode);
        return mErrorListProvider;
    }
}

用它:

mErrorListProvider = ErrorListHelper.GetErrorListProvider();

并添加一个错误:

ErrorTask errorTask = new ErrorTask();

            errorTask.Line = err.LineIndex;
            errorTask.Column = err.ColumnIndex;
            errorTask.Text = err.Text;
            errorTask.ErrorCategory = TaskErrorCategory.Warning;
            errorTask.Document = mFilePath;

            errorTask.Navigate += errorTask_Navigate;

            mErrorListProvider.Tasks.Add(errorTask);
于 2013-10-29T17:17:37.433 回答