2010-05-10 8 views

Respuesta

13

El evento OnBuildDone no puede decirle lo que sucedió. Algunos proyectos en la solución pueden haber construido correctamente, otros no. Necesitarás OnBuildProjConfigDone en su lugar. Incendios para cada proyecto, el argumento de Success te dice si funcionó.

+0

En mi caso, el OnBuildDone nunca se activó, pero el OnBuildProjConfigDone funcionó bien –

+0

@DinisCruz A veces OnBuildDone no se activa si no mantienes la referencia a dte.Events.BuildEvents – Artiom

+1

Hay una muestra de código completo de cómo hacer esto aquí: https://github.com/edsykes/VisualStudioBuildEvents –

6

Normalmente, debe gestionar varios proyectos en construcción. Esto podría ser una construcción de solución o construir un proyecto que dependa de otro proyecto.

lo tanto, para averiguar cuándo una acumulación éxito ha terminado, es necesario utilizar una combinación de los dos eventos de generación:

OnBuildProjConfigDone y OnBuildDone.

También necesitará una variable de miembro para rastrear el estado general de compilación.

Se llamará a su controlador OnBuildProjConfigDone para cada proyecto que se genera, y se le pasa un bool para indicarle si la compilación del proyecto fue exitosa. Asigne este resultado a su variable miembro para realizar un seguimiento del estado general.

Finalmente, se llamará a su controlador OnBuildDone. Aquí, puede ver su variable de miembro para ver si ha fallado la compilación de algún proyecto.

Aquí hay un código de ejemplo de una extensión que escribí para VS2012. La extensión proporciona un comando de "compilación personalizada" que crea el proyecto activo y ejecuta el depurador si la compilación fue exitosa.

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

¿Qué es el "GetGlobalService"? Estoy en VS2010, ¿tal vez un artículo específico de 2012? – granadaCoder

+0

GetGlobalService es un método en Microsoft.VisualStudio.Shell.Package, que mis subclases de extensión. – ryanman

2

Para lectores futuros, consulte este artículo.

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

y/o

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

Básicamente, podría haber un error. La solución alternativa es establecer una variable miembro de ".BuildEvents" en Connect.

Ejemplo:

private _BuildEvents _buildEvents; 

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

Entonces cablear los controladores de eventos a

this._buildEvents 

y no

_applicationObject.Events.BuildEvents 

donde _applicationObject = (EnvDTE.DTE) aplicación;

Vale la pena intentarlo al menos, en mi humilde opinión.

+0

Dispara. Ahora que escribí lo anterior, encontré una muy buena respuesta SOF. http://stackoverflow.com/questions/14165885/add-in-events-are-never-executed – granadaCoder

Cuestiones relacionadas