Как получить уведомление о завершении успешной сборки? - PullRequest
10 голосов
/ 10 мая 2010

Я пишу надстройку VS и мне нужно запустить определенный метод после успешной сборки. Я пытался использовать dte.Events.BuildEvents.OnBuildDone, но это событие происходит, даже если сборка не удалась.

Есть ли какое-либо свойство или другое событие, которое я должен использовать?

Ответы [ 3 ]

13 голосов
/ 10 мая 2010

Событие OnBuildDone не может сообщить вам, что произошло. Некоторые проекты в решении могли быть построены правильно, а некоторые - нет. Вместо этого вам потребуется OnBuildProjConfigDone. Запускает каждый проект, аргумент Успешный сообщает вам, работал ли он.

6 голосов
/ 22 ноября 2012

Как правило, вам нужно работать с несколькими строящимися проектами.Это может быть сборка решения или сборка проекта, который зависит от другого проекта.

Итак, чтобы выяснить, когда успешная сборка завершена, вам нужно использовать комбинацию из двух событий сборки:

OnBuildProjConfigDone и OnBuildDone.

Вам также понадобится переменная-член для отслеживания общего состояния сборки.

Ваш обработчик OnBuildProjConfigDone будет вызываться для каждого проекта, который собирается, и он получаетпрошел bool, чтобы сказать вам, была ли успешной эта сборка проекта.Присвойте этот результат переменной-члену, чтобы отслеживать общее состояние.

Наконец, будет вызван ваш обработчик OnBuildDone.Здесь вы можете просмотреть переменную-член, чтобы увидеть, не удалась ли какая-либо сборка проекта.

Вот пример кода из расширения, которое я написал для VS2012.Расширение предоставляет команду «пользовательская сборка», которая собирает активный проект и запускает отладчик, если сборка прошла успешно.

private bool _overallBuildSuccess;
private bool _customBuildInProgress;

private void CustomBuild_MenuItemCallback(object sender, EventArgs e)
{
    // Listen to the necessary build events.
    DTE2 dte = (DTE2)GetGlobalService(typeof(SDTE));
    dte.Events.BuildEvents.OnBuildDone += BuildEvents_OnBuildDone;
    dte.Events.BuildEvents.OnBuildProjConfigDone += BuildEvents_OnBuildProjConfigDone;

    try
    {
        // Build the active project.
        _customBuildInProgress = true;
        dte.ExecuteCommand("Build.BuildSelection");
    }
    catch (COMException)
    {
        _customBuildInProgress = false;
        WriteToOutputWindow("Build", "Could not determine project to build from selection");
    }
}

private void BuildEvents_OnBuildProjConfigDone(string project, string projectConfig, string platform, string solutionConfig, bool success)
{
    // Ignore this build event if we didn't start it.
    if (!_customBuildInProgress)
    {
        return;
    }

    // Keep track of the overall build success.
    _overallBuildSuccess = success;
}

private void BuildEvents_OnBuildDone(EnvDTE.vsBuildScope scope, EnvDTE.vsBuildAction action)
{
    // Ignore this build event if we didn't start it.
    if (!_customBuildInProgress)
    {
        return;
    }

    _customBuildInProgress = false;

    if (_overallBuildSuccess)
    {
        // Launch the debugger.
        DTE2 dte = (DTE2)GetGlobalService(typeof(SDTE));
        dte.ExecuteCommand("Debug.Start");
    }
    else
    {
        WriteToOutputWindow("Build", "Custom build failed.");
    }
}

private void WriteToOutputWindow(string paneName, string message)
{
    DTE2 dte = (DTE2)GetGlobalService(typeof(SDTE));

    Window window = dte.Windows.Item(EnvDTE.Constants.vsWindowKindOutput);
    OutputWindow outputWindow = (OutputWindow)window.Object;

    OutputWindowPane targetPane = outputWindow.OutputWindowPanes.Cast<OutputWindowPane>()
        .FirstOrDefault(x => x.Name.ToLower() == paneName.ToLower());

    if (targetPane == null)
    {
        targetPane = outputWindow.OutputWindowPanes.Add(paneName);
    }

    targetPane.Activate();
    outputWindow.ActivePane.OutputString(message);
    outputWindow.ActivePane.OutputString(Environment.NewLine);
}
2 голосов
/ 11 сентября 2013

Для будущих читателей, ознакомьтесь с этой статьей.

http://blogs.msdn.com/b/alexpetr/archive/2012/08/14/visual-studio-2012-and-buildevents-in-addins.aspx

и / или

http://support.microsoft.com/kb/555102/en-us

В принципе, может быть ошибка. Обходное решение - установить переменную-член ".BuildEvents" в Connect.

Пример:

private _BuildEvents _buildEvents;

public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom)
              {
                _buildEvents = _applicationObject.Events.BuildEvents;
              }

Затем подключите обработчики событий к

this._buildEvents

а не

_applicationObject.Events.BuildEvents

где _applicationObject = (EnvDTE.DTE) приложение;

Стоит попробовать хотя бы, ИМХО.

...