Захват результатов сборки в Visual Studio 2010 - PullRequest
7 голосов
/ 14 марта 2011

Есть ли способ, которым я могу захватить выходные данные сборки, то есть текст, который выводится в окно вывода? Прямо сейчас моя единственная альтернатива для копирования и вставки текста из окна вывода - сборка из командной строки и перенаправление вывода в файл.

Беглый взгляд на параметры командной строки компилятора C # не обнаруживает никакой опции для указания выходного файла для сообщений, таких как предупреждения и ошибки, поэтому я предполагаю, что VS перехватывает в выходной поток процесса csc.exe, чтобы захватить его текст и запишите его в окно вывода. Возможно, есть пробел, в котором пользовательское приложение также может подключиться.

Ответы [ 4 ]

5 голосов
/ 15 марта 2011

Добавьте следующий макрос в VS EnvironmentEvent Модуль (Инструменты-> Макросы-> Макросы IDE ...) или ALT + F11.Макрос запускается после успешного завершения сборки.

Это будет направлять текстовый вывод из окна вывода, точнее, представление Build окна вывода, в build_output.log.Другие Руководства IDE можно найти в MSDN .

В качестве справки, решение было основано на HOWTO: Получить OutputWindowPane для вывода некоторой строки из надстройки Visual Studio или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 ...

3 голосов
/ 13 сентября 2011

Я не знаю, облегчает ли это, если вы это знаете, но Visual Studio устанавливает переменную окружения VS_UNICODE_OUTPUT, и она используется компилятором cl.exe для отправки своих выходных данных непосредственно в VS.Если вы очистите эту переменную, вывод cl.exe перейдет к стандартному выводу с ошибкой.

Надеюсь, это поможет!

3 голосов
/ 14 марта 2011

Я думаю, вы могли бы использовать 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));
}

Надежда помогает!

0 голосов
/ 14 марта 2011

Вы можете использовать расширяемость Visual Studio (http://msdn.microsoft.com/en-us/vstudio/ff718165), чтобы иметь возможность читать содержимое окна вывода. В этом разделе показано, как получить ссылку на него: Как мне написать в Окно вывода Visual Studio в Моем пользовательском инструменте? .

...