예제 #1
0
        public static Task <BuildResult> ExecuteAsync(this BuildSubmission submission)
        {
            var tcs = new TaskCompletionSource <BuildResult>();

            submission.ExecuteAsync(SetBuildComplete, tcs);
            return(tcs.Task);
        }
예제 #2
0
        /// <summary>
        /// Builds all the content files which have been added to the project,
        /// dynamically creating .xnb files in the OutputDirectory.
        /// Returns an error message if the build fails.
        /// </summary>
        public string Build()
        {
            // Clear any previous errors.
            errorLogger.Errors.Clear();

            // Create and submit a new asynchronous build request.
            BuildManager.DefaultBuildManager.BeginBuild(buildParameters);

            BuildRequestData request    = new BuildRequestData(buildProject.CreateProjectInstance(), new string[0]);
            BuildSubmission  submission = BuildManager.DefaultBuildManager.PendBuildRequest(request);

            submission.ExecuteAsync(null, null);

            // Wait for the build to finish.
            submission.WaitHandle.WaitOne();

            BuildManager.DefaultBuildManager.EndBuild();

            // If the build failed, return an error string.
            if (submission.BuildResult.OverallResult == BuildResultCode.Failure)
            {
                return(string.Join("\n", errorLogger.Errors.ToArray()));
            }

            return(null);
        }
예제 #3
0
        private static Task <BuildResult> ExecuteAsync(this BuildSubmission submission)
        {
            var tcs = new TaskCompletionSource <BuildResult>();

            submission.ExecuteAsync(s => tcs.SetResult(s.BuildResult), null);
            return(tcs.Task);
        }
예제 #4
0
        internal static Task <Microsoft.Build.Execution.BuildResult> ExecuteAsync(this BuildSubmission submission)
        {
            var tcs = new TaskCompletionSource <Microsoft.Build.Execution.BuildResult>();

            submission.ExecuteAsync(s => tcs.SetResult(s.BuildResult), null);
            return(tcs.Task);
        }
예제 #5
0
        public static Task <BuildResult> ExecuteAsync(this BuildSubmission buildSubmission)
        {
            var taskCompletionSource = new TaskCompletionSource <BuildResult>();

            buildSubmission.ExecuteAsync(BuildSubmissionCompleteCallbackFunction, taskCompletionSource);
            return(taskCompletionSource.Task);
        }
예제 #6
0
        private static void build()
        {
            buildParameters = new BuildParameters();
            BuildManager.DefaultBuildManager.BeginBuild(buildParameters);

            BuildRequestData request    = new BuildRequestData(buildProject.CreateProjectInstance(), new string[0]);
            BuildSubmission  submission = BuildManager.DefaultBuildManager.PendBuildRequest(request);

            submission.ExecuteAsync(null, null);

            submission.WaitHandle.WaitOne();
            BuildManager.DefaultBuildManager.EndBuild();
        }
예제 #7
0
        public void RegisteringLoggerDuringBuildThrowsException()
        {
            string          projectBody = ObjectModelHelpers.CleanupFileContents(@"
<Project ToolsVersion='msbuilddefaulttoolsversion' xmlns='msbuildnamespace'>
    <Target Name='Test'>
        <Exec Command='Sleep 1' />
    </Target>
</Project>
");
            ProjectInstance project     = (new Project(XmlReader.Create(new StringReader(projectBody)))).CreateProjectInstance();

            BuildManager    buildManager        = BuildManager.DefaultBuildManager;
            MuxLogger       muxLogger           = new MuxLogger();
            BuildParameters parameters          = new BuildParameters(ProjectCollection.GlobalProjectCollection);
            AutoResetEvent  projectStartedEvent = new AutoResetEvent(false);

            parameters.Loggers = new ILogger[] { muxLogger, new EventingLogger(projectStartedEvent) };
            MockLogger mockLogger   = new MockLogger();
            bool       gotException = false;

            buildManager.BeginBuild(parameters);

            try
            {
                BuildSubmission submission = buildManager.PendBuildRequest(new BuildRequestData(project, new string[0], null));

                submission.ExecuteAsync(null, null);
                projectStartedEvent.WaitOne();

                try
                {
                    muxLogger.RegisterLogger(submission.SubmissionId, mockLogger);
                }
                catch (InvalidOperationException)
                {
                    gotException = true;
                }
                catch
                {
                }
            }
            finally
            {
                buildManager.EndBuild();
            }

            Assert.True(gotException); // "Failed to get exception registering logger during build."
        }
예제 #8
0
        /// <summary>
        /// Builds all the content files which have been added to the project,
        /// dynamically creating .xnb files in the OutputDirectory.
        /// Returns an error message if the build fails.
        /// </summary>
        public string Build()
        {
            // Create and submit a new asynchronous build request.
            BuildManager.DefaultBuildManager.BeginBuild(buildParameters);

            BuildRequestData request    = new BuildRequestData(buildProject.CreateProjectInstance(), new string[0]);
            BuildSubmission  submission = BuildManager.DefaultBuildManager.PendBuildRequest(request);

            submission.ExecuteAsync(null, null);

            // Wait for the build to finish.
            submission.WaitHandle.WaitOne();

            BuildManager.DefaultBuildManager.EndBuild();


            return(null);
        }
예제 #9
0
        public bool Build(string outPath)
        {
            BuildManager.DefaultBuildManager.BeginBuild(buildParameters);
            BuildRequestData request    = new BuildRequestData(buildProject.CreateProjectInstance( ), new string[0]);
            BuildSubmission  submission = BuildManager.DefaultBuildManager.PendBuildRequest(request);

            submission.ExecuteAsync(null, null);
            submission.WaitHandle.WaitOne( );
            BuildManager.DefaultBuildManager.EndBuild( );

            if (submission.BuildResult.OverallResult == BuildResultCode.Failure)
            {
                return(false);
            }

            this.copyBuiltContent(outPath);
            Thread.Sleep(250);
            this.deleteTempDirectory( );
            return(true);
        }
예제 #10
0
        public string Build()
        {
            _errorLogger.Errors.Clear();

            BuildManager.DefaultBuildManager.BeginBuild(_buildParameters);

            BuildRequestData request    = new BuildRequestData(_buildProject.CreateProjectInstance(), new string[0]);
            BuildSubmission  submission = BuildManager.DefaultBuildManager.PendBuildRequest(request);

            submission.ExecuteAsync(null, null);
            submission.WaitHandle.WaitOne();

            BuildManager.DefaultBuildManager.EndBuild();

            if (submission.BuildResult.OverallResult == BuildResultCode.Failure)
            {
                return(string.Join("\n", _errorLogger.Errors.ToArray()));
            }

            return(null);
        }
예제 #11
0
        public void RegisteringLoggerDuringBuildThrowsException()
        {
            string          projectBody = ObjectModelHelpers.CleanupFileContents(@"
<Project ToolsVersion='msbuilddefaulttoolsversion' xmlns='msbuildnamespace'>
    <Target Name='Test'>
        <Exec Command='Sleep 1' />
    </Target>
</Project>
");
            ProjectInstance project     = (new Project(XmlReader.Create(new StringReader(projectBody)))).CreateProjectInstance();

            BuildManager    buildManager        = BuildManager.DefaultBuildManager;
            MuxLogger       muxLogger           = new MuxLogger();
            BuildParameters parameters          = new BuildParameters(ProjectCollection.GlobalProjectCollection);
            AutoResetEvent  projectStartedEvent = new AutoResetEvent(false);

            parameters.Loggers = new ILogger[] { muxLogger, new EventingLogger(projectStartedEvent) };
            MockLogger mockLogger = new MockLogger();

            buildManager.BeginBuild(parameters);

            Should.Throw <InvalidOperationException>(() =>
            {
                try
                {
                    BuildSubmission submission = buildManager.PendBuildRequest(new BuildRequestData(project, Array.Empty <string>(), null));

                    submission.ExecuteAsync(null, null);
                    projectStartedEvent.WaitOne();

                    // This call should throw an InvalidOperationException
                    muxLogger.RegisterLogger(submission.SubmissionId, mockLogger);
                }
                finally
                {
                    buildManager.EndBuild();
                }
            });
        }
        public string Build()
        {
            // Clear any previous errors.
            _errorLogger.Errors.Clear();

            // Create and submit a new asynchronous build request.
            BuildManager.DefaultBuildManager.BeginBuild(_buildParameters);

            var             request    = new BuildRequestData(_buildProject.CreateProjectInstance(), new string[0]);
            BuildSubmission submission = BuildManager.DefaultBuildManager.PendBuildRequest(request);

            submission.ExecuteAsync(null, null);

            // Wait for the build to finish.
            submission.WaitHandle.WaitOne();

            BuildManager.DefaultBuildManager.EndBuild();

            var output = new StringBuilder();

            if (submission.BuildResult.OverallResult == BuildResultCode.Failure)
            {
                output.Append(string.Join("\n", _errorLogger.Errors.ToArray()));
            }

            // handle error output
            var secondaryImporterErrors = _secondaryImporters.Where(kvp => kvp.Value.Item2.Any())
                                          .Select(kvp => kvp.Value)
                                          .SelectMany(item => item.Item2.Select(file =>
            {
                var errorResult = item.Item1.Invoke(file);
                return(string.IsNullOrWhiteSpace(errorResult) ? null : string.Format("{0}: {1}\n", file.AssetName, errorResult));
            }))
                                          .Where(outputString => !string.IsNullOrWhiteSpace(outputString))
                                          .Aggregate("", (acc, item) => acc + "\n" + item);

            output.AppendLine(secondaryImporterErrors);
            return(output.ToString());
        }
예제 #13
0
        public void Build(string[] projectPaths, string target, bool parallelBuild, int maxNodeCount = 1)
        {
            Console.WriteLine("========================================");

            BuildParameters buildParameters = new BuildParameters(ProjectCollection.GlobalProjectCollection)
            {
                Loggers = new[] { _logger },
                MaxNodeCount = maxNodeCount
            };
            if (!parallelBuild)
            {
                foreach (string projectPath in projectPaths)
                {
                    Console.WriteLine("Building {0}...", projectPath);
                    BuildResult buildResult = _buildManager.Build(buildParameters, CreateRequest(projectPath, target));
                    Console.WriteLine("=====> [{0}] {1}", buildResult.OverallResult, projectPath);
                }
            }
            else
            {
                _buildManager.BeginBuild(buildParameters);
                using (CountdownEvent countdownEvent = new CountdownEvent(projectPaths.Length))
                {
                    foreach (string projectPath in projectPaths)
                    {
                        Console.WriteLine("Building {0} in parallel...", projectPath);
                        BuildSubmission submission = _buildManager.PendBuildRequest(CreateRequest(projectPath, target));
                        submission.ExecuteAsync(o => {
                            Console.WriteLine("=====> [{0}] {1}", o.BuildResult.OverallResult, projectPath);
                            countdownEvent.Signal();
                        }, null);
                    }
                    countdownEvent.Wait();
                }
                _buildManager.EndBuild();
            }
        }
예제 #14
0
        public bool Build(IVsProject project, BuildCallback buildCallback, BuildLogger buildLogger, string platform, string configuration)
        {
            return(project.WithProject((MSBuildProject msproject) =>
            {
                //
                // We need to set this before we acquire the build resources otherwise Msbuild
                // will not see the changes.
                //
                bool onlyLogCriticalEvents = msproject.ProjectCollection.OnlyLogCriticalEvents;
                msproject.ProjectCollection.Loggers.Add(buildLogger);
                msproject.ProjectCollection.OnlyLogCriticalEvents = false;

                uint cookie;
                int err = BuildManagerAccessor.AcquireBuildResources(VSBUILDMANAGERRESOURCE.VSBUILDMANAGERRESOURCE_DESIGNTIME |
                                                                     VSBUILDMANAGERRESOURCE.VSBUILDMANAGERRESOURCE_UITHREAD, out cookie);

                if (err != VSConstants.E_PENDING && err != VSConstants.S_OK)
                {
                    ErrorHandler.ThrowOnFailure(err);
                }

                if (err == VSConstants.E_PENDING)
                {
                    msproject.ProjectCollection.Loggers.Remove(buildLogger);
                    msproject.ProjectCollection.OnlyLogCriticalEvents = onlyLogCriticalEvents;

                    Dispatcher = Dispatcher.CurrentDispatcher;
                    BuildAvailableEvent = new ManualResetEvent(false);
                    BuildAvailableEvent.SafeWaitHandle = new SafeWaitHandle(BuildManagerAccessor.DesignTimeBuildAvailable, false);

                    Thread t = new Thread(() =>
                    {
                        BuildAvailableEvent.WaitOne();
                        Dispatcher.BeginInvoke(new Action(() =>
                        {
                            Package.Instance.BuildNextProject();
                        }));
                    });
                    t.Start();
                    return false;
                }
                else
                {
                    try
                    {
                        Dictionary <string, string> properties = new Dictionary <string, string>();
                        properties["Platform"] = platform;
                        properties["Configuration"] = configuration;

                        BuildRequestData buildRequest = new BuildRequestData(
                            msproject.FullPath,
                            properties,
                            null,
                            new string[] { "SliceCompile" },
                            msproject.ProjectCollection.HostServices,
                            BuildRequestDataFlags.ProvideProjectStateAfterBuild |
                            BuildRequestDataFlags.IgnoreExistingProjectState |
                            BuildRequestDataFlags.ReplaceExistingProjectInstance);

                        BuildSubmission submission = BuildManager.DefaultBuildManager.PendBuildRequest(buildRequest);
                        ErrorHandler.ThrowOnFailure(BuildManagerAccessor.RegisterLogger(submission.SubmissionId, buildLogger));
                        Dispatcher.BeginInvoke(DispatcherPriority.Send, new Action(() =>
                        {
                            buildCallback.BeginBuild(platform, configuration);
                        }));
                        submission.ExecuteAsync(s =>
                        {
                            Dispatcher.BeginInvoke(DispatcherPriority.Send, new Action(() =>
                            {
                                msproject.ProjectCollection.Loggers.Remove(buildLogger);
                                msproject.ProjectCollection.OnlyLogCriticalEvents = onlyLogCriticalEvents;
                                BuildManagerAccessor.ReleaseBuildResources(cookie);
                                s.BuildManager.ResetCaches();
                                BuildManagerAccessor.UnregisterLoggers(s.SubmissionId);
                                buildCallback.EndBuild(s.BuildResult.OverallResult == BuildResultCode.Success);
                            }));
                        }, null);

                        return true;
                    }
                    catch (Exception)
                    {
                        msproject.ProjectCollection.Loggers.Remove(buildLogger);
                        msproject.ProjectCollection.OnlyLogCriticalEvents = onlyLogCriticalEvents;
                        BuildManagerAccessor.ReleaseBuildResources(cookie);
                        throw;
                    }
                }
            }));
        }
예제 #15
0
        public bool Build(IVsProject p, BuildCallback buildCallback, BuildLogger buildLogger)
        {
            MSBuildProject project = MSBuildUtils.LoadedProject(ProjectUtil.GetProjectFullPath(p), DTEUtil.IsCppProject(p), false);

            //
            // We need to set this before we acquire the build resources otherwise Msbuild
            // will not see the changes.
            //
            bool onlyLogCriticalEvents = project.ProjectCollection.OnlyLogCriticalEvents;

            project.ProjectCollection.Loggers.Add(buildLogger);
            project.ProjectCollection.OnlyLogCriticalEvents = false;

            uint cookie;
            int  err = BuildManagerAccessor.AcquireBuildResources(VSBUILDMANAGERRESOURCE.VSBUILDMANAGERRESOURCE_DESIGNTIME |
                                                                  VSBUILDMANAGERRESOURCE.VSBUILDMANAGERRESOURCE_UITHREAD, out cookie);

            if (err != VSConstants.E_PENDING && err != VSConstants.S_OK)
            {
                ErrorHandler.ThrowOnFailure(err);
            }

            if (err == VSConstants.E_PENDING)
            {
                project.ProjectCollection.Loggers.Remove(buildLogger);
                project.ProjectCollection.OnlyLogCriticalEvents = onlyLogCriticalEvents;

                Dispatcher          = Dispatcher.CurrentDispatcher;
                BuildAvailableEvent = new System.Threading.ManualResetEvent(false);
                BuildAvailableEvent.SafeWaitHandle = new SafeWaitHandle(BuildManagerAccessor.DesignTimeBuildAvailable, false);

                Thread t = new Thread(() =>
                {
                    BuildAvailableEvent.WaitOne();
                    Dispatcher.BeginInvoke(new Action(() =>
                    {
                        Package.Instance.BuildNextProject();
                    }));
                });
                t.Start();
                return(false);
            }
            else
            {
                try
                {
                    Dictionary <string, string> properties = new Dictionary <string, string>();
                    String platform = buildCallback.ProjectConfiguration.PlatformName;
                    properties["Platform"]      = platform.Equals("Any CPU") ? "AnyCPU" : platform;
                    properties["Configuration"] = buildCallback.ProjectConfiguration.ConfigurationName;

                    BuildRequestData buildRequest = new BuildRequestData(
                        ProjectUtil.GetProjectFullPath(p),
                        properties,
                        null,
                        new String[] { "IceBuilder_Compile" },
                        project.ProjectCollection.HostServices,
                        BuildRequestDataFlags.IgnoreExistingProjectState |
                        BuildRequestDataFlags.ReplaceExistingProjectInstance);

                    BuildSubmission submission = BuildManager.DefaultBuildManager.PendBuildRequest(buildRequest);
                    ErrorHandler.ThrowOnFailure(BuildManagerAccessor.RegisterLogger(submission.SubmissionId, buildLogger));
                    buildCallback.BeginBuild();
                    submission.ExecuteAsync((s) =>
                    {
                        Dispatcher.BeginInvoke(DispatcherPriority.Send, new Action(() =>
                        {
                            project.ProjectCollection.Loggers.Remove(buildLogger);
                            project.ProjectCollection.OnlyLogCriticalEvents = onlyLogCriticalEvents;
                            BuildManagerAccessor.ReleaseBuildResources(cookie);
                            BuildManagerAccessor.UnregisterLoggers(submission.SubmissionId);
                            buildCallback.EndBuild(submission.BuildResult.OverallResult == BuildResultCode.Success);
                        }));
                    }, null);

                    return(true);
                }
                catch (Exception)
                {
                    project.ProjectCollection.Loggers.Remove(buildLogger);
                    project.ProjectCollection.OnlyLogCriticalEvents = onlyLogCriticalEvents;
                    BuildManagerAccessor.ReleaseBuildResources(cookie);
                    throw;
                }
            }
        }