如何从cl.exe返回编译错误

时间:2015-11-15 21:03:17

标签: c# c++ process cl.exe

为了大学的教育目的,我正在开发一个模块化的WCF C#应用程序。客户端应用程序发送源,服务器负责编译,测试并将结果返回给客户端。

服务器的一个模块执行编译作业。它消耗源并产生一个EXE供其他模块使用。

我的问题是:当用C ++编写给定源代码时调用cl.exe时,我设法编译它,但是编译模块无法正确地从子进程接收错误消息{ {1}},然后启动cmd.exe。源代码和实际发生的事例的例子说超过一百万字,所以这里是:

cl.exe

当来源出现错误时,例如缺少';'在某处,然后这是我在控制台中看到的:

Console contents screenshot

然后我决定运行Visual Studio命令提示符,给它相同的源代码,这是我得到的:

enter image description here

说明:

    使用
  1. 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;并且编译模块不会从其子进程接收任何内容。

  2. 我很惊讶while(true){}打印消息" Microsoft(R)32位C / C ++优化..."和"版权所有(C)......保留所有权利。"到它的错误输出 - 流,我希望从中收到编译错误。

  3. 我在网上搜索任何信息,发现了一些线索,这帮助我从子进程中获得了任何信息。现在,下一步是获得我需要的东西。

  4. 我无法找到启动VS命令提示符的方法,因为它实际上是一个快捷方式,而不是指向exe,因此我无法从中受益。< / p>

  5. 任何帮助将不胜感激!谢谢! :)

0 个答案:

没有答案