Я написал инструмент командной строки, который предварительно обрабатывает несколько файлов, а затем компилирует их с помощью CodeDom. Инструмент записывает уведомление об авторских правах и некоторый текст прогресса в стандартный вывод, а затем записывает любые ошибки на этапе компиляции, используя следующий формат:
foreach (var err in results.Errors) {
// err is CompilerError
var filename = "Path\To\input_file.xprt";
Console.WriteLine(string.Format(
"{0} ({1},{2}): {3}{4} ({5})",
filename,
err.Line,
err.Column,
err.IsWarning ? "" : "ERROR: ",
err.ErrorText,
err.ErrorNumber));
}
Затем он записывает количество ошибок, например "14 ошибок".
Это пример того, как ошибка появляется на консоли:
Path\To\input_file.xrpt (73,28): ERROR: An object reference is required for the non-static field, method, or property 'Some.Object.get' (CS0120)
Когда я запускаю это как настраиваемый инструмент в VS2008 (вызывая его в командной строке события пост-сборки одной из моих сборщиков проектов), ошибки отображаются в формате "отлично" в списке ошибок с правильным текстом в каждом столбце, Когда я просматриваю имя файла, открывается всплывающий путь. Строка и столбец отличаются от исходного файла из-за предварительной обработки, которая в порядке. Единственное, что выделяется, это то, что проект, указанный в списке, является тем, у которого есть событие после сборки.
Проблема заключается в том, что при двойном щелчке ошибки ничего не происходит. Я бы ожидал, что файл откроется в редакторе.
Я хорошо осведомлен о пространстве имен Microsoft.VisualStudio.Shell.Interop
, но я думаю, что это должно быть возможно только путем записи стандартного вывода.
EDIT: я заметил некоторые моменты и сам решил:
- FQP, который появляется при перелистывании имени файла, на самом деле не прав,
- Я выводил путь относительно корня пути решения,
- инструмент вызывается в проекте в другой папке,
- и VS формирует путь относительно пути вызывающего проекта