C# 格式化自定义工具的输出,以便我可以双击Visual Studio中的错误并打开文件
我已经编写了一个命令行工具,它可以预处理许多文件,然后使用CodeDom编译它们。该工具将版权声明和一些进度文本写入标准输出,然后使用以下格式写入编译步骤中的任何错误:C# 格式化自定义工具的输出,以便我可以双击Visual Studio中的错误并打开文件,c#,visual-studio,visual-studio-2008,msbuild,C#,Visual Studio,Visual Studio 2008,Msbuild,我已经编写了一个命令行工具,它可以预处理许多文件,然后使用CodeDom编译它们。该工具将版权声明和一些进度文本写入标准输出,然后使用以下格式写入编译步骤中的任何错误: foreach (var err in results.Errors) { // err is CompilerError var filename = "Path\To\input_file.xprt"; Console.WriteLine(string.Format( "{0} ({1
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任务
,然后您可以访问日志
对象:
Log.LogError(subcategory, errorCode, helpKeyword, file, lineNumber, columnNumber,
endLineNumber, endColumnNumber, message, messageArgs);
例如,这就是工作原理。此外,这使得将工具添加到项目文件更容易(只需将任务放到
中,您就完成了)
如果不想这样做,请确保工具的输出完全符合Visual Studio的期望:
一个重要的“问题”是文件路径应输出为绝对路径,否则Visual Studio可能会错误地扩展它们。由于我在工具中输出相对路径,Visual Studio使用调用项目的路径形成文件的绝对路径,这意味着生成的绝对路径不存在。解决方案就是将绝对路径输出到源文件。另请参见: