In genere, è necessario gestire più progetti in corso di creazione. Potrebbe essere una soluzione da costruire o la costruzione di un progetto che dipende da un altro progetto.
Così, per capire quando una creazione che è terminata, è necessario utilizzare una combinazione dei due eventi di generazione:
OnBuildProjConfigDone e OnBuildDone.
Avrai anche bisogno di una variabile membro per tenere traccia dello stato generale della costruzione.
Il tuo gestore OnBuildProjConfigDone verrà chiamato per ogni progetto che viene generato e viene passato un bool per dirti se la creazione del progetto ha avuto successo. Assegna questo risultato alla tua variabile membro per tenere traccia dello stato generale.
Infine, il gestore OnBuildDone verrà chiamato. Qui puoi vedere la tua variabile membro per vedere se qualche build del progetto è fallita.
Ecco un esempio di codice da un'estensione che ho scritto per VS2012. L'estensione fornisce un comando "custom build" che crea il progetto attivo e avvia il debugger se la compilazione ha avuto successo.
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);
}
Nel mio caso OnBuildDone non ha mai funzionato, ma OnBuildProjConfigDone ha funzionato bene –
@DinisCruz A volte OnBuildDone non si attiva se non si mantiene il riferimento a dte.Events.BuildEvents – Artiom
Esiste un esempio di codice completo su come eseguire questa operazione qui: https://github.com/edsykes/VisualStudioBuildEvents –