2011-03-14 24 views
7

有沒有一種方法可以捕獲構建輸出,即輸出到輸出窗口的文本?現在我唯一的選擇是從輸出窗口複製和粘貼文本,是從命令行生成並將輸出重定向到文件。在Visual Studio 2010中捕獲構建輸出

快速查看C#編譯器命令行選項不會顯示任何指定輸出文件的警告和錯誤等消息的選項,所以我猜測VS掛鉤到csc.exe進程的輸出流中,以捕獲它文本並將其寫入輸出窗口。也許有一個自定義應用程序也可以掛鉤的差距。

+0

它將msbuild.exe的輸出重定向到輸出窗口。這裏沒有中間地帶,無論是從命令行構建還是從IDE構建。它必須按照它的方式工作,沒有其他方法可以通過錯誤列表窗口向您顯示構建錯誤。 – 2011-03-14 13:35:17

+0

@Hans,我不是在命令行和IDE之間尋找中間地帶。我正在尋找一種方法來在IDE構建過程中自動捕獲輸出到輸出窗口的內容,因爲我認爲我在問題的第一段已經清楚了。 – ProfK 2011-03-14 14:38:52

回答

5

將以下宏添加到VS EnvironmentEvent模塊(工具 - >宏 - >宏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終極測試...

3

我想你可以使用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 studio設置了一個環境變量VS_UNICODE_OUTPUT,cl.exe編譯器使用它來直接將它的輸出發送到VS.如果清除此變量,則cl.exe輸出將轉爲標準輸出並出錯。

希望有幫助!

+0

謝謝,我會檢查出來。 – ProfK 2011-09-13 18:57:56

相關問題