【问题标题】:Capture build output within Visual Studio 2010在 Visual Studio 2010 中捕获生成输出
【发布时间】:2011-07-14 23:33:11
【问题描述】:

有没有一种方法可以捕获构建输出,即输出到输出窗口的文本?现在,除了从输出窗口复制和粘贴文本之外,我唯一的替代方法是从命令行构建并将输出重定向到文件。

快速查看 C# 编译器命令行选项并没有显示任何用于为警告和错误等消息指定输出文件的选项,所以我猜测 VS 挂钩到 csc.exe 进程的输出流,以捕获其文本并将其写入输出窗口。也许还有一个空白,自定义应用程序也可以挂钩。

【问题讨论】:

  • 它将 msbuild.exe 的输出重定向到输出窗口。这里没有中间地带,无论是从命令行构建还是从 IDE 构建。它必须按照它的方式工作,没有其他方法可以让错误列表窗口向您显示构建错误。
  • @Hans,我不是在寻找命令行和 IDE 之间的中间地带。我正在寻找一种在 IDE 构建期间自动捕获输出到“输出”窗口的方法,因为我认为我在问题的第一段中已经足够清楚了。

标签: visual-studio visual-studio-2010 build


【解决方案1】:

将以下宏添加到 VS EnvironmentEvent Module (Tools->Macros->Macros IDE...) 或 ALT+F11。无论成功与否,宏都会在构建完成后运行。

这会将来自输出窗口的文本输出(更具体地说是输出窗口的Build 视图)通过管道传输到build_output.log。其他IDE Guids can be found on MSDN

作为参考,解决方案基于HOWTO: Get an OutputWindowPane to output some string from a Visual Studio add-in or macro

Visual Studio 提供了一个输出 窗口(“视图”,“其他窗口”, “输出”菜单)显示消息,调试 信息等。该窗口提供 可以选择的几个窗格 通过组合框,例如“源 控制”、“构建”、“调试”等

自动化模型 (EnvDTE) 提供 EnvDTE.OutputWindow, EnvDTE.OutputWindowPanes 和 EnvDTE.OutputWindowPane 类。

 Private Sub BuildEvents_OnBuildDone(ByVal Scope As EnvDTE.vsBuildScope, ByVal Action As EnvDTE.vsBuildAction) Handles BuildEvents.OnBuildDone

        Const BUILD_OUTPUT_PANE_GUID As String = "{1BD8A850-02D1-11D1-BEE7-00A0C913D1F8}"

        Dim t As OutputWindowPane
        Dim txtOutput As TextDocument
        Dim txtSelection As TextSelection
        Dim vsWindow As Window

        vsWindow = DTE.Windows.Item(EnvDTE.Constants.vsWindowKindOutput)

        Dim vsOutputWindow As OutputWindow
        Dim objOutputWindowPane As OutputWindowPane
        Dim objBuildOutputWindowPane As OutputWindowPane
        vsOutputWindow = DirectCast(vsWindow.Object, OutputWindow)

        For Each objOutputWindowPane In vsOutputWindow.OutputWindowPanes
            If objOutputWindowPane.Guid.ToUpper = BUILD_OUTPUT_PANE_GUID Then
                objBuildOutputWindowPane = objOutputWindowPane
                Exit For
            End If
        Next


        txtOutput = objBuildOutputWindowPane.TextDocument
        txtSelection = txtOutput.Selection

        txtSelection.StartOfDocument(False)
        txtSelection.EndOfDocument(True)
        objBuildOutputWindowPane.OutputString(Date.Now)

        txtSelection = txtOutput.Selection
        solutionDir = IO.Path.GetDirectoryName(DTE.Solution.FullName)

        My.Computer.FileSystem.WriteAllText(solutionDir & "\build_output.log", txtSelection.Text, False)


        MsgBox(txtSelection.Text)

    End Sub

上面的内容也可以调整为可能在每个项目的基础上输出构建信息。构建日志等的文件名可能可以根据当前正在构建的项目进行配置(对此不太确定),最重要的是您可以保留构建历史。

可以挂钩的VS事件有很多,所以可以做的事情是无穷无尽的

这是在 VS2010 Ultimate 上测试的...

【讨论】:

    【解决方案2】:

    我认为您可以使用DebugView 或开发应用程序来捕获输出窗口结果。

    来自MSDN 管理输出窗口的示例:

    public void writeReadOW(DTE2 dte)
    {
        // Add-in code.
        // Create a reference to the Output window.
        // Create a tool window reference for the Output window
        // and window pane.
        OutputWindow ow = dte.ToolWindows.OutputWindow;
        OutputWindowPane owP;
        // Create a reference to the pane contents.
        TextDocument owPTxtDoc;
        EditPoint2 strtPt;
    
        // Select the Build pane in the Output window.
        owP = ow.OutputWindowPanes.Item("Build");
        owP.Activate();
        owPTxtDoc = owP.TextDocument;
    
        // Put some text in the pane.
        owP.OutputString("Testing 123.");
        // Retrieve the text contents of the pane.
        System.Windows.Forms.MessageBox.Show("Startpoint: " + 
          owPTxtDoc.StartPoint.DisplayColumn);
        strtPt = (EditPoint2)owPTxtDoc.StartPoint.CreateEditPoint();
        System.Windows.Forms.MessageBox.Show
          (strtPt.GetText(owPTxtDoc.EndPoint));
    }
    

    希望有所帮助!

    【讨论】:

      【解决方案3】:

      如果您知道这一点,我不知道这是否会使事情变得更容易,但是 Visual Studios 设置了一个环境变量 VS_UNICODE_OUTPUT,cl.exe 编译器使用它来将其输出直接发送到 VS。如果您清除此变量,cl.exe 输出将进入标准输出和错误输出。

      希望有帮助!

      【讨论】:

        【解决方案4】:

        您可以使用 Visual Studio 可扩展性 (http://msdn.microsoft.com/en-us/vstudio/ff718165) 来读取输出窗口的内容。本主题可以展示如何获取对它的引用:How do I write to the Visual Studio Output Window in My Custom Tool?

        【讨论】:

          猜你喜欢
          • 2012-05-04
          • 1970-01-01
          • 2010-09-09
          • 1970-01-01
          • 1970-01-01
          • 2011-04-12
          • 1970-01-01
          • 2014-01-20
          • 1970-01-01
          相关资源
          最近更新 更多