Как правило, вам нужно работать с несколькими строящимися проектами.Это может быть сборка решения или сборка проекта, который зависит от другого проекта.
Итак, чтобы выяснить, когда успешная сборка завершена, вам нужно использовать комбинацию из двух событий сборки:
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);
}