using Microsoft.Build.Execution; namespace SharpIDE.Application.Features.Build; public static class BuildManagerExtensions { /// /// Convenience method. Submits a lone build request and returns a Task that will complete when results are available. /// /// Thrown if a build is already in progress. public static async Task BuildAsync(this BuildManager buildManager, BuildParameters parameters, BuildRequestData requestData, CancellationToken cancellationToken = default) { BuildResult result; buildManager.BeginBuild(parameters); try { var tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); await using var _ = cancellationToken.Register(() => buildManager.CancelAllSubmissions()).ConfigureAwait(false); try { var buildSubmission = buildManager.PendBuildRequest(requestData); buildSubmission.ExecuteAsync(sub => { var buildResult = sub.BuildResult!; tcs.SetResult(buildResult); }, null); } catch (Exception ex) { tcs.SetException(ex); } result = await tcs.Task.ConfigureAwait(false); } finally { buildManager.EndBuild(); } return result; } }