Frage

Ich schreibe eine VS-Add-in und ich brauche eine bestimmte Methode nach einem erfolgreichen Build auszuführen. Ich habe versucht, dte.Events.BuildEvents.OnBuildDone verwenden, aber das Ereignis geschieht, selbst wenn die Build fehlgeschlagen.

Gibt es eine Eigenschaft oder eine andere Veranstaltung, die ich verwenden soll?

War es hilfreich?

Lösung

Das OnBuildDone Ereignis kann nicht sagen, was passiert ist. Einige Projekte in der Lösung könnte richtig aufgebaut haben, einige nicht. Sie werden stattdessen brauchen OnBuildProjConfigDone. Feuer für jedes Projekt, das Erfolg Argument sagt Ihnen, ob es funktioniert hat.

Andere Tipps

Normalerweise müssen Sie mehrere Projekte zu handhaben gebaut. Dies könnte eine Lösung gebaut werden, oder bauen ein Projekt, das auf einem anderen Projekt abhängig ist.

Also, um herauszufinden, wann ein erfolgreicher Build abgeschlossen ist, müssen Sie eine Kombination aus den beiden Build-Ereignisse verwenden:

OnBuildProjConfigDone und OnBuildDone.

Sie haben auch eine Membervariable müssen den gesamten Build-Status verfolgen.

Dein OnBuildProjConfigDone Handler für jedes Projekt erhalten genannt, die gebaut werden, und es wird ein Bool übergeben, Ihnen zu sagen, ob das Projekt Build erfolgreich war. Ordnen Sie dieses Ergebnis zu Ihrem Membervariable Spur über den Gesamtzustand zu halten.

Schließlich wird Ihre OnBuildDone Handler aufgerufen. Hier können Sie an Ihrem Membervariable, um zu sehen, ob ein Projekt Build fehlgeschlagen.

Hier ist ein Beispiel-Code aus einer Verlängerung I für VS2012 geschrieben. Die Erweiterung stellt einen „Maßarbeit“ Befehl, der das aktive Projekt und startet der Debugger baut, wenn die Build erfolgreich war.

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);
}

Für zukünftige Leser in diesem Artikel überprüfen.

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

Im Grunde könnte es ein Problem sein. Die Work-around ist eine Membervariable der „.BuildEvents“ auf eine Verbindung zu setzen.

Beispiel:

private _BuildEvents _buildEvents;

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

Draht dann die Event-Handler bis zu

this._buildEvents

und nicht

_applicationObject.Events.BuildEvents

Dabei gilt _applicationObject = (EnvDTE.DTE) Anwendung;

Es ist einen Versuch wert, zumindest meiner Meinung nach.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top