通过代码运行MSBUILD并获得异步进度 [英] Running MSBUILD through code and getting asynchronous progress

查看:320
本文介绍了通过代码运行MSBUILD并获得异步进度的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想通过代码运行MSBUILD,并获得build的异步状态(类似于TeamCity或任何其他构建运行器)。



我我使用以下代码:

  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任务?

解决方案

您必须异步调用构建并在循环中测试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(submission.BuildResult.OverallResult == BuildResultCode.Failure)
{//做一些错误任务
}
}


I am wanting to run MSBUILD through code, and get asynchronous status of the build as it progresses (similar to TeamCity or any other build runner does).

I am using the following code:

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);

Is there a way to get the current executing MSBUILD task through code?

解决方案

you have to call build asyncronously and to test iscomplete in a loop where you can make your progress tracking:.

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           
        } 
    }

这篇关于通过代码运行MSBUILD并获得异步进度的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆