格式化自定义工具的输出,以便我可以在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)); } 

然后它写入错误的数量,如“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命名空间,但我认为应该可以通过写入标准输出来实现。

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

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

执行此操作的标准方法是将您的工具实现为MSBuild Task ,然后您可以访问Log对象:

 Log.LogError(subcategory, errorCode, helpKeyword, file, lineNumber, columnNumber, endLineNumber, endColumnNumber, message, messageArgs); 

例如,这是Gendarme / Visual Studio集成的工作原理。 此外,这使您可以更轻松地将工具添加到项目文件中(只需在删除任务完成)。

如果您不想这样做,那么请确保您的工具输出完全符合Visual Studio的预期: http : //blogs.msdn.com/b/msbuild/archive/2006/11/03/msbuild-视觉工作室感知错误的消息和消息,formats.aspx

一个重要的“问题”是文件路径应该作为绝对路径输出,否则Visual Studio可能会错误地扩展它们。

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