Visual Studio 2015 - список ошибок чтения EnvDTE
Я собираюсь создать небольшой инструмент сборки. Единственное, что он должен сделать: попытаться построить решение и вывести ошибки. Но не у меня есть следующая проблема: В случае сбоя сборки я не могу прочитать список ошибок. Программа застревает и ждет до бесконечности.
Я создал небольшой тестовый класс, который ничего не делает, кроме создания экземпляра Visual Studio 2015, сборки данного решения и считывания ErrorList при сбое сборки.
class Class1
{
DTE2 dte = (DTE2)System.Activator.CreateInstance(System.Type.GetTypeFromProgID("VisualStudio.DTE.14.0", true));
public void Test()
{
int id = dte.LocaleID;
//dte.MainWindow.Visible = true;
dte.Events.BuildEvents.OnBuildDone += new _dispBuildEvents_OnBuildDoneEventHandler(BuildEvents_OnBuildDone);
string solutionFile = @"C:\MyProjects\SolutionWithBuildErrors.sln";
dte.Solution.Open(solutionFile);
while (!dte.Solution.IsOpen)
System.Threading.Thread.Sleep(100);
Console.WriteLine("Start Build");
dte.Solution.SolutionBuild.Build(true);
Console.WriteLine("Finished Build");
dte.Quit();
}
private void BuildEvents_OnBuildDone(vsBuildScope Scope, vsBuildAction Action)
{
Console.WriteLine("BuildEvents_OnBuildDone Called");
int buildInfo = dte.Solution.SolutionBuild.LastBuildInfo;
switch (buildInfo)
{
case 0:
Console.WriteLine("Build erfolgreich");
break;
case 1:
Console.WriteLine("Build fehlerhaft");
getErrorList();
break;
}
}
private void getErrorList()
{
//dte.ExecuteCommand("View.ErrorList", " ");
Console.WriteLine("Lade Tool Windows");
ToolWindows tw = dte.ToolWindows;
Console.WriteLine("Geladen, Tool Windows");
Console.WriteLine("Lade ErrorList");
ErrorList el = tw.ErrorList;
Console.WriteLine("Geladen, ErrorList");
el.ShowErrors = true;
Console.WriteLine("Lese Error Liste");
//dte.ExecuteCommand("View.ErrorList", " ");
//ErrorItems errors = dte.ToolWindows.ErrorList.ErrorItems;
Console.WriteLine("#Errors: " + dte.ToolWindows.ErrorList.ErrorItems.Count);
for (int i = 1; i <= dte.ToolWindows.ErrorList.ErrorItems.Count; i++)
{
ErrorItem ei = dte.ToolWindows.ErrorList.ErrorItems.Item(i);
string errorLevel = "N/A";
errorLevel = ei.ErrorLevel.ToString();
string desc = "N/A";
if (ei.Description != null)
desc = ei.Description.ToString();
string file = "N/A";
if (ei.FileName != null)
file = ei.FileName.ToString();
string line = "N/A";
line = ei.Line.ToString();
string error = string.Format("{0}: {1}, File: {2}, Line: {3}", errorLevel, desc, file, line);
Console.WriteLine(error);
}
}
}
Для тестирования просто создайте консольное приложение. В основном:
Class1 c1 = new Class1();
c1.Test();
Console.ReadLine();
Необходимые импорты: EnvDTE EnvDTE80
Я уже пытался запустить Visual Studio в Visible-Mode, и в случае, когда экземпляр Visual Studio получает фокус, находясь в режиме "ожидания чтения ErrorList", можно прочитать ErrorList. Если Visual Studio никогда не получает фокус (потому что работает невидимым или никогда не щелкает в то время как работает видимым), невозможно получить ErrorList.
Может быть, есть другой способ зачитать ErrorList? Только что нашел решение, которое я использую =(
Может быть, вы можете помочь мне или убедиться, что действительно есть проблемы с ErrorList.
2 ответа
Это еще один способ получить список ошибок - если это действительно ваша проблема:
EnvDTE.Window window = this.dte.Windows.Item(EnvDTE80.WindowKinds.vsWindowKindErrorList);
EnvDTE80.ErrorList sel = (EnvDTE80.ErrorList)window.Selection;
Но оба способа должны быть достаточно эквивалентными. Microsoft переписала реализацию окна списка ошибок для VS 2015, что привело к возникновению некоторых проблем в процессе, поэтому я бы посоветовал попробовать ваш код с более ранними версиями.
Была ли эта проблема решена или нет, я не знаю, но если она существует, перейдите к концепции ActiveX, чтобы решить эту проблему (более или менее вы можете перейти к пользовательскому управлению). Конечно, эта проблема решится. Я сделал то же самое для своих требований. Не нужно фокусироваться на соответствующей Visual Studio.