C# 通过代码运行MSBUILD并获得异步进度

C# 通过代码运行MSBUILD并获得异步进度,c#,msbuild,continuous-integration,C#,Msbuild,Continuous Integration,我希望通过代码运行MSBUILD,并在构建过程中获得构建的异步状态(类似于TeamCity或任何其他构建运行程序) 我正在使用以下代码: var projectFileName = @"...\MyApplication\MyApplication.sln"; ProjectCollection pc = new ProjectCollection(); var GlobalProperty = new Dictionary<string, string>(); GlobalProp

我希望通过代码运行MSBUILD,并在构建过程中获得构建的异步状态(类似于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);
var projectFileName=@“…\MyApplication\MyApplication.sln”;
ProjectCollection pc=新建ProjectCollection();
var GlobalProperty=新字典();
添加(“配置”、“调试”);
添加(“平台”、“x86”);
var buildRequest=newbuildrequestdata(projectFileName,GlobalProperty,null,新字符串[]{“Build”},null);
var buildResult=BuildManager.DefaultBuildManager.Build(新的BuildParameters(pc)、buildRequest);

有没有办法通过代码获取当前正在执行的MSBUILD任务?

您必须异步调用build,并在循环中测试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           
        } 
    }
private void按钮1\u单击(对象发送者,事件参数e)
{
var projectFileName=@“…\MyApplication\MyApplication.sln”;
ProjectCollection pc=新建ProjectCollection();
var GlobalProperty=新字典();
添加(“配置”、“调试”);
添加(“平台”、“x86”);
DefaultBuildManager.BeginBuild(新构建参数(pc));
BuildRequestData请求=新的BuildRequestData(projectFileName,GlobalProperty,null,新字符串[]{“Build”},null);
BuildSubmission=BuildManager.DefaultBuildManager.PendBuildRequest(请求);
submission.ExecuteAsync(null,null);
int-cpt=0;
而(!submission.IsCompleted)
{
cpt++;
textBox1.Text=cpt.ToString();
}
BuildManager.DefaultBuildManager.EndBuild();
//如果生成失败,则返回错误字符串。
if(submission.BuildResult.OverallResult==BuildResultCode.Failure)
{//执行一些错误任务
} 
}

我实际上在考虑设置一个MSBUILD日志提供程序,并查看它是否有生成完成消息?