托管扩展性框架(MEF)错误列表

时间:2013-01-06 19:50:19

标签: mef

我在Visual Studio 2010中使用Managed Extensibility Framework(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 { }
    }
}

1 个答案:

答案 0 :(得分: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);