格式化自定义工具的输出,以便我可以在Visual Studio中双击错误并打开文件

Reb*_*ott 12 c# msbuild visual-studio-2008 visual-studio

我编写了一个命令行工具,它预处理了许多文件,然后使用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));
}
Run Code Online (Sandbox Code Playgroud)

然后它写入错误的数量,如"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)
Run Code Online (Sandbox Code Playgroud)

当我在VS2008中将其作为自定义工具运行时(通过在我的项目程序集之一的后期构建事件命令行中调用它),错误在错误列表中显示格式很好,每列中都有正确的文本.当我翻转文件名时,会弹出完全限定的路径.行和列与源文件不同,因为预处理很好.唯一突出的是列表中给出的项目是具有后构建事件的项目.

问题是,当我双击错误时,没有任何反应.我原本希望文件在编辑器中打开.

我很清楚地知道Microsoft.VisualStudio.Shell.Interop命名空间,但我认为应该可以通过写入标准输出来实现.

编辑:我注意到了一些问题,并自己解决了这个问题:

  • 滚动文件名时弹出的FQP实际上并不正确,
  • 我正在输出相对于解决方案根路径的路径,
  • 该工具正在另一个文件夹中的项目中调用,
  • VS正在形成相对于调用项目路径的路径

Reb*_*ott 3

由于我在工具中输出相对路径,Visual Studio 使用调用项目的路径形成文件的绝对路径,这意味着生成的绝对路径不存在。解决方案是简单地输出源文件的绝对路径。