在C#中,如何以及如何在ErrorListProvider(IServiceProvider isp)中传递IServiceProvider?

问题描述 投票:0回答:2

我正在创建一个vsix项目,需要在“错误列表”窗口中添加一些自定义错误。现在我被困在IServiceProvider中。它包含什么,为什么我需要它以及如何获得它?在我的代码中,我需要使用服务提供商进行初始化。我怎样才能做到这一点?以下是代码:

internal class ErrorListManager
{
    public static ErrorListProvider errorListProvider;

    public static void Initialize(IServiceProvider serviceProvider) 
    {
        errorListProvider = new ErrorListProvider(serviceProvider);

    }

    public static void AddError(string errorMsg) {
        AddTask(errorMsg, TaskErrorCategory.Error);
    }

    private static void AddTask(string errorMsg, TaskErrorCategory category)
    {
        errorListProvider.Tasks.Add(new ErrorTask
        {
            Category = TaskCategory.User,
            ErrorCategory = category,
            Text = errorMsg
        });
    }
}

请帮助。我是C#和VSIX的初学者。谢谢!

c# asynchronous vsix service-provider error-list
2个回答
0
投票

您的包裹是服务提供商。它的基类AsyncPackage从实现OLE.Interop.IServiceProvider和System.IServiceProvider的Package类派生(是的,VSX令人困惑,并且有两个IServiceProvider接口)。因此,从您的包类中,您将调用ErrorListManager.Initialize(this)。

就是说,您可能希望将VS 2015及更高版本的新API用于ErrorList。您使用的旧方法不允许您将值添加到“代码”等列中。请参见此处的示例:

VSSDK-Extensibility-Samples / ErrorList:https://github.com/microsoft/VSSDK-Extensibility-Samples/tree/master/ErrorList

madskristensen / WebAccessibilityChecker:https://github.com/madskristensen/WebAccessibilityChecker/tree/master/src/ErrorList

madskristensen / TaskOutputListener:https://github.com/madskristensen/TaskOutputListener/blob/master/src/ErrorListProvider/ErrorListProvider.cs


0
投票

要在VS错误列表中写一些东西,您需要使用ErrorListProvider。在我的实现中,我从ErrorListProvider继承并为“ ErrorWindowController”实现自己的行为。代码看起来像这样(有关更多信息,请阅读代码注释):

public class ErrorWindowController : ErrorListProvider
{

#region Constructor

/// <summary>
/// Instance Constructor
/// </summary>
/// <param name="aServiceProvider"></param>
public ErrorWindowController(IServiceProvider aIServiceProvider) : base(aIServiceProvider)
{
}

#endregion


#region Public Methods

// Use this to add a collection of custom errors in VS Error List
public void AddErrors(IEnumerable<ErrorModel> aErrors)
{
    SuspendRefresh();

    foreach (ErrorModel error in aErrors)
    {
      ErrorTask errorTask = new ErrorTask
      {
        ErrorCategory = error.Category,
        Document = error.FilePath,
        Text = error.Description,
        Line = error.Line - 1,
        Column = error.Column,
        Category = TaskCategory.BuildCompile,
        Priority = TaskPriority.High,
        HierarchyItem = error.HierarchyItem
      };
      errorTask.Navigate += ErrorTaskNavigate;
      Tasks.Add(errorTask);
    }

    BringToFront();
    ResumeRefresh();
}

// Remove all the errors from Error List which are depending of a project and this specific project is closed
// Or remove all the errors from Error List when the VS solution is closed
public void RemoveErrors(IVsHierarchy aHierarchy)
{
    SuspendRefresh();

    for (int i = Tasks.Count - 1; i >= 0; --i)
    {
      var errorTask = Tasks[i] as ErrorTask;
      aHierarchy.GetCanonicalName(Microsoft.VisualStudio.VSConstants.VSITEMID_ROOT, out string nameInHierarchy);
      errorTask.HierarchyItem.GetCanonicalName(Microsoft.VisualStudio.VSConstants.VSITEMID_ROOT, out string nameErrorTaskHierarchy);
      if (nameInHierarchy == nameErrorTaskHierarchy)
      {
        errorTask.Navigate -= ErrorTaskNavigate;
        Tasks.Remove(errorTask);
      }
    }

    ResumeRefresh();
}

// Remove all the errors from the Error List
public void Clear()
{
    Tasks.Clear();
}


#endregion


#region Private Methods

// This is optional
// Add navigation for your errors. 
private void ErrorTaskNavigate(object sender, EventArgs e)
{
  ErrorTask objErrorTask = (ErrorTask)sender;
  objErrorTask.Line += 1;
  bool bResult = Navigate(objErrorTask, new Guid(EnvDTE.Constants.vsViewKindCode));
  objErrorTask.Line -= 1;
}


#endregion
}

ErrorModel非常简单:

public class ErrorModel
{
  #region Properties

  public string FilePath { get; set; }

  public int Line { get; set; }

  public int Column { get; set; }

  public TaskErrorCategory Category { get; set; }

  public string Description { get; set; }

  public IVsHierarchy HierarchyItem { get; set; }

  #endregion

}

幸福的祝福!

© www.soinside.com 2019 - 2024. All rights reserved.