Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 格式化自定义工具的输出,以便我可以双击Visual Studio中的错误并打开文件_C#_Visual Studio_Visual Studio 2008_Msbuild - Fatal编程技术网

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

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

我已经编写了一个命令行工具,它可以预处理许多文件,然后使用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
任务
,然后您可以访问
日志
对象:

Log.LogError(subcategory, errorCode, helpKeyword, file, lineNumber, columnNumber,
    endLineNumber, endColumnNumber, message, messageArgs);
例如,这就是工作原理。此外,这使得将工具添加到项目文件更容易(只需将任务放到
中,您就完成了)

如果不想这样做,请确保工具的输出完全符合Visual Studio的期望:


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

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

另请参见: