2012-08-12 70 views
2

我想通过代码运行的MSBuild,并获得建造的异步状态,因为它的进展(类似于TeamCity的或任何其他构建亚军一样)。通过代码运行的MSBuild并获得异步进度

我使用下面的代码:

var projectFileName = @"...\MyApplication\MyApplication.sln"; 
ProjectCollection pc = new ProjectCollection(); 
var GlobalProperty = new Dictionary<string, string>(); 
GlobalProperty.Add("Configuration", "Debug"); 
GlobalProperty.Add("Platform", "x86"); 

var buildRequest = new BuildRequestData(projectFileName, GlobalProperty, null, new string[] { "Build" }, null); 

var buildResult = BuildManager.DefaultBuildManager.Build(new BuildParameters(pc), buildRequest); 

有没有办法打通当前代码执行的MSBuild任务?

回答

9

你必须调用建立asyncronously和在一个循环中,你可以让你的进度跟踪测试iscomplete :.

private void button1_Click(object sender, EventArgs e) 
    { 
     var projectFileName = @"...\MyApplication\MyApplication.sln"; 
     ProjectCollection pc = new ProjectCollection(); 
     var GlobalProperty = new Dictionary<string, string>(); 
     GlobalProperty.Add("Configuration", "Debug"); 
     GlobalProperty.Add("Platform", "x86"); 
     BuildManager.DefaultBuildManager.BeginBuild(new BuildParameters(pc)); 
     BuildRequestData request = new BuildRequestData(projectFileName, GlobalProperty, null, new string[] { "Build" }, null); 
     BuildSubmission submission = BuildManager.DefaultBuildManager.PendBuildRequest(request); 
     submission.ExecuteAsync(null, null); 
     int cpt = 0; 
     while (!submission.IsCompleted) 
     { 
      cpt++; 
      textBox1.Text = cpt.ToString(); 
     } 


     BuildManager.DefaultBuildManager.EndBuild(); 
     // If the build failed, return an error string.  
     if (submission.BuildResult.OverallResult == BuildResultCode.Failure)  
     {     //do some error task   
     } 
    } 
+0

我实际上是在考虑设置一个MSBUILD日志提供程序,并观察它的构建完成消息吗? – Doug 2012-10-23 10:16:09

+0

我会说这绝对是正确的答案 – OrPaz 2014-02-24 15:00:33