为了大学的教育目的,我正在开发一个模块化的WCF C#应用程序。客户端应用程序发送源,服务器负责编译,测试并将结果返回给客户端。
服务器的一个模块执行编译作业。它消耗源并产生一个EXE供其他模块使用。
我的问题是:当用C ++编写给定源代码时调用cl.exe
时,我设法编译它,但是编译模块无法正确地从子进程接收错误消息{ {1}},然后启动cmd.exe
。源代码和实际发生的事例的例子说超过一百万字,所以这里是:
cl.exe
当来源出现错误时,例如缺少';'在某处,然后这是我在控制台中看到的:
然后我决定运行Visual Studio命令提示符,给它相同的源代码,这是我得到的:
说明:
public static string clPath = @"E:\path_to_project\Client\clTo4kaEXE\";
string sourceCode = "//given source";
using (StreamWriter sw = new StreamWriter(clPath + exeName + ".cpp"))
{
sw.Write(sourceCode);
sw.Flush();
}
Process clTo4kaEXE = new Process();
clTo4kaEXE.StartInfo.FileName = clPath + "cmd.exe";
clTo4kaEXE.StartInfo.WorkingDirectory = clPath;
clTo4kaEXE.StartInfo.UseShellExecute = false;
clTo4kaEXE.StartInfo.RedirectStandardOutput = true;
clTo4kaEXE.StartInfo.RedirectStandardError = true;
clTo4kaEXE.StartInfo.RedirectStandardInput = true;
clTo4kaEXE.StartInfo.Arguments = "%comspec% /k \"\"e:\\vs2010\\VC\\vcvarsall.bat\"\" x86";
clTo4kaEXE.Start();
clTo4kaEXE.StandardInput.WriteLine("cl /EHsc " + exeName + ".cpp");
StreamReader clStandardOutput = clTo4kaEXE.StandardOutput;
StreamReader clErrorOutput = clTo4kaEXE.StandardError;
string clStdOutput = "";
string temp = "";
while(true)
{
//Debugger.Launch(); // breakpoint
temp = clStandardOutput.ReadLine();
Console.WriteLine("STD TEMP = {0}", temp);
clStdOutput += temp;
//if (temp == null /*|| temp == "" */|| clStandardOutput.EndOfStream)
//{
// break;
//}
if (clStandardOutput.Peek() == -1 && temp == "")
{
break;
}
}
string clErrOutput = "";
temp = "";
while (true)
{
temp = clErrorOutput.ReadLine();
Console.WriteLine("ERROR TEMP = {0}", temp);
clErrOutput += temp;
//if (temp == null || temp == "" || clErrorOutput.EndOfStream)
//{
// break;
//}
if (clErrorOutput.Peek() == -1 && temp == "")
{
break;
}
}
clTo4kaEXE.Close();
Console.WriteLine("[Modul_Compile] cl.exe returned on its standard output: {0}\n", clStdOutput);
Console.WriteLine("[Modul_Compile] cl.exe returned on its error output: {0}\n", clErrOutput);
代替clStdOutput= clStandardOutput.ReadToEnd();
会导致客户端应用的窗口“冻结”#34;并且编译模块不会从其子进程接收任何内容。
我很惊讶while(true){}
打印消息" Microsoft(R)32位C / C ++优化..."和"版权所有(C)......保留所有权利。"到它的错误输出 - 流,我希望从中收到编译错误。
我在网上搜索任何信息,发现了一些线索,这帮助我从子进程中获得了任何信息。现在,下一步是获得我需要的东西。
我无法找到启动VS命令提示符的方法,因为它实际上是一个快捷方式,而不是指向exe,因此我无法从中受益。< / p>
任何帮助将不胜感激!谢谢! :)