private void ExecuteTarget(IEnumerable <EnvDTE.Project> selectedProjects, string targetName)
        {
            var output    = new OutputWindowLoggerAdaptor(true);
            var succeeded = 0;
            var failed    = 0;

            foreach (var project in selectedProjects)
            {
                project.Save(); //Save the project in Visual Studio

                var config = project.ConfigurationManager.ActiveConfiguration;
                output.OutputString($"------ Executing: '{project.Name} -> {targetName}' for '{config.ConfigurationName}|{config.PlatformName}' ------");

                using (var buildManager = new BuildManager())
                {
                    var res = buildManager.Build(CreateBuildParameters(), CreateBuildRequestData(project, targetName));
                    if (res.OverallResult == BuildResultCode.Failure)
                    {
                        output.OutputString($"========== '{project.Name} -> {targetName}' FAILED ==========");
                        failed++;
                    }
                    else
                    {
                        output.OutputString($"========== '{project.Name} -> {targetName}' succeeded ==========");
                        succeeded++;
                    }
                }

                if (failed == 0)
                {
                    output.OutputString($"========== {targetName}: {succeeded} project(s) succeeded ==========");
                }
                else
                {
                    output.OutputString($"========== {targetName}: {succeeded} project(s) succeeded, {failed} project(s) FAILED ==========");
                }
            }
        }
        private void ExecuteTarget(IEnumerable <EnvDTE.Project> selectedProjects, string targetName)
        {
            ThreadHelper.ThrowIfNotOnUIThread();

            var buildInfo = new List <ProjectBackgroundBuildInfo>();

            foreach (var project in selectedProjects)
            {
                project.Save(); //Save the EnvDTE project instance

                // Add to ProjectBackgroundBuildInfo list
                var config = project.ConfigurationManager.ActiveConfiguration;
                buildInfo.Add(new ProjectBackgroundBuildInfo {
                    ProjectName      = project.Name,
                    ConfigName       = config.ConfigurationName,
                    PlatformName     = config.PlatformName,
                    BuildParameters  = CreateBuildParameters(),
                    BuildRequestData = CreateBuildRequestData(project, targetName)
                });
            }

            var output = new OutputWindowLoggerAdaptor(true);

            output.Activate();

            // Run build in background thread
            var previousCursor = Mouse.OverrideCursor;

            Mouse.OverrideCursor = Cursors.Wait;
            Task.Run(() =>
            {
                var succeeded = 0;
                var failed    = 0;

                using (var buildManager = new BuildManager())
                {
                    foreach (var bi in buildInfo)
                    {
                        var res = buildManager.Build(bi.BuildParameters, bi.BuildRequestData);

                        if (res.OverallResult == BuildResultCode.Failure)
                        {
                            output.OutputString($"========== '{bi.ProjectName} -> {targetName}' FAILED ==========");
                            failed++;
                        }
                        else
                        {
                            output.OutputString($"========== '{bi.ProjectName} -> {targetName}' succeeded ==========");
                            succeeded++;
                        }

                        if (failed == 0)
                        {
                            output.OutputString($"========== {targetName}: {succeeded} project(s) succeeded ==========");
                        }
                        else
                        {
                            output.OutputString($"========== {targetName}: {succeeded} project(s) succeeded, {failed} project(s) FAILED ==========");
                        }
                    }
                }
            }).ContinueWith(t =>
            {
                Mouse.OverrideCursor = previousCursor;
            }, TaskScheduler.FromCurrentSynchronizationContext());
        }