我需要从C#项目构建外部C ++解决方案

时间:2017-01-12 11:26:06

标签: c# cmd build msbuild

我正在开发一个在目录中查找解决方案文件的程序,然后在指定的配置和平台上构建您选择的任何程序,但我很难在C#中使用它。我希望构建的解决方案是C ++,因为它的价值。我有一个程序的C ++版本,但想转换它以获得Winforms GUI的额外好处。

我很高兴使用任何可用的方法,并尝试了以下两种方法,但每种方法都有自己的问题。

private void buildSolution1(string solution, Tuple<string, string> config)
{
     logEvent("Building " + solution + " on " + config.Item1 + "|" + config.Item2);
     ProjectCollection pc = new ProjectCollection();
     Dictionary<string, string> globalProperty = new Dictionary<string, string>();
     globalProperty.Add("Configuration", config.Item1);
     globalProperty.Add("Platform", config.Item2);
     globalProperty.Add("OutputPath", @"C:\data");

     BuildParameters bp = new BuildParameters(pc);
     BuildManager.DefaultBuildManager.BeginBuild(bp);
     BuildRequestData buildRequest = new BuildRequestData(solution, globalProperty, "4.0", new string[] { "Build" }, null);
     BuildSubmission submission = BuildManager.DefaultBuildManager.PendBuildRequest(buildRequest);
     submission.ExecuteAsync(null, null);
     while (!submission.IsCompleted)
     {
         logEvent("building");
     }
     BuildManager.DefaultBuildManager.EndBuild();
     logEvent(submission.BuildResult.OverallResult.ToString());
}

private void buildSolution2(string solution, string config)
{
     string devenv = Environment.ExpandEnvironmentVariables("\"%VS120COMNTOOLS%..\\ide\\devenv.com\"");
     string cmdArg = "/c" + devenv + " \"" + solution + "\" /build " + "\"" + config + "\"";
     System.Diagnostics.Process process = new System.Diagnostics.Process();
     System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
     startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
     startInfo.WorkingDirectory = @"C:\";
     startInfo.FileName = "cmd.exe";
     startInfo.UseShellExecute = false;
     startInfo.Arguments = cmdArg;
     process.StartInfo = startInfo;
     process.Start();
     process.WaitForExit();
}

在任何一种情况下,'字符串解决方案'作为我想要构建的解决方案的路径传入,config是包含配置和平台的元组或包含两者的字符串,以“|”分隔符号。 logEvent()只是一个打印到我的GUI的函数。

buildSolution1(): 这个每次都失败了,我不知道为什么。它很快打印出“构建”一堆,然后将OverallResult报告为“失败”。

buildSolution2(): 这个打开CMD.exe没有传递任何参数,并没有运行任何东西。如果没有开头的/ c属性,它只会打开空白窗口。有了它,它就会打开,然后很快再次关闭。

希望有人可以帮助我,提前感谢您的时间。

詹姆斯

1 个答案:

答案 0 :(得分:1)

为了其他有类似问题的人的利益,我能够使用以下代码使用该函数:

private void buildSolution(string solution, string config)
{
    string devenv = Environment.ExpandEnvironmentVariables("\"%VS120COMNTOOLS%..\\ide\\devenv.com\"");
    string cmdArg = "\"" + solution + "\" /build " + "\"" + config + "\"";
    System.Diagnostics.Process process = new System.Diagnostics.Process();
    System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
    startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
    startInfo.WorkingDirectory = @"C:\";
    startInfo.FileName = devenv;
    startInfo.UseShellExecute = true;
    startInfo.Arguments = cmdArg;
    process.StartInfo = startInfo;
    process.Start();
    process.WaitForExit();
}