我正在开发一个在目录中查找解决方案文件的程序,然后在指定的配置和平台上构建您选择的任何程序,但我很难在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属性,它只会打开空白窗口。有了它,它就会打开,然后很快再次关闭。
希望有人可以帮助我,提前感谢您的时间。
詹姆斯
答案 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();
}