protected virtual MSBuildResult InvokeMsBuild(string target)
{
var result = MSBuildResult.Failed;
const bool designTime = true;
var requiresUIThread = UIThread.Instance.IsUIThread;
// we don't run tasks that require calling the STA thread, so unless we're ON it, we don't need it.
var accessor = Site.GetService(typeof (SVsBuildManagerAccessor)) as IVsBuildManagerAccessor;
MSBuildExecution.BuildSubmission submission = null;
if (buildProject != null)
{
if (!TryBeginBuild(designTime, requiresUIThread))
{
throw new InvalidOperationException("A build is already in progress.");
}
try
{
// Do the actual Build
var targetsToBuild = new string[target != null ? 1 : 0];
if (target != null)
{
targetsToBuild[0] = target;
}
CurrentConfig = BuildProject.CreateProjectInstance();
var requestData = new MSBuildExecution.BuildRequestData(CurrentConfig, targetsToBuild,
BuildProject.ProjectCollection.HostServices,
MSBuildExecution.BuildRequestDataFlags.ReplaceExistingProjectInstance);
submission = MSBuildExecution.BuildManager.DefaultBuildManager.PendBuildRequest(requestData);
if (accessor != null)
{
ErrorHandler.ThrowOnFailure(accessor.RegisterLogger(submission.SubmissionId, buildLogger));
}
var buildResult = submission.Execute();
result = buildResult.OverallResult == MSBuildExecution.BuildResultCode.Success
? MSBuildResult.Successful
: MSBuildResult.Failed;
}
finally
{
EndBuild(submission, designTime, requiresUIThread);
}
}
return result;
}