我正在创建一个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的初学者。谢谢!
您的包裹是服务提供商。它的基类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
要在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
}
幸福的祝福!