C# 使用ProcessStartInfo调用exe获取不到重定向数据的解决方案
程序员文章站
2022-04-03 23:44:59
emmmmm,最近在研究WFDB工具箱,C语言写的,无奈本人C语言功底不够,只想直接拿来用,于是打算通过ProcessStartInfo来调取编译出来的exe程序获取输出。 一开始就打算偷懒,从园子里的前辈blog上偷来部分代码,和着自己写的代码差不多就写了以下调取程序的代码: 然后使用时发现了问题 ......
emmmmm,最近在研究wfdb工具箱,c语言写的,无奈本人c语言功底不够,只想直接拿来用,于是打算通过processstartinfo来调取编译出来的exe程序获取输出。
一开始就打算偷懒,从园子里的前辈blog上偷来部分代码,和着自己写的代码差不多就写了以下调取程序的代码:
1 /// <summary> 2 /// 调用exe核心代码 3 /// </summary> 4 /// <param name="exefilename"></param> 5 /// <param name="args"></param> 6 public void runexe(string exefilename, string args = "") 7 { 8 try 9 { 10 11 process p = new process(); 12 13 p.startinfo = new processstartinfo(exefilename, args); 14 15 p.startinfo.arguments = args; 16 //p.startinfo.workingdirectory = @"c:\mingw\msys\1.0\home\61125\wfdb-10.6.1\build\bin"; 17 p.startinfo.useshellexecute = false; 18 19 p.startinfo.redirectstandardoutput = true; 20 21 //p.startinfo.redirectstandardinput = true; 22 23 p.startinfo.redirectstandarderror = true; 24 25 p.startinfo.createnowindow = false; 26 //绑定事件 27 p.outputdatareceived += new datareceivedeventhandler(p_outputdatareceived); 28 p.errordatareceived += p_errordatareceived; 29 30 p.start(); 31 p.beginoutputreadline();//开始读取输出数据 32 p.waitforexit(); 33 p.close(); 34 } 35 catch (exception e) 36 { 37 console.writeline(e); 38 throw; 39 } 40 }
然后使用时发现了问题,按照wfdb 中app的设计,直接调取exe是会弹出help内容的,可是我自己调用却不行。
无奈自己就搭建c环境,mingw配合visual code配置了一把,踩了好多坑,才在windows环境下跑起了wfdb并能够调试。具体坑就不谈了。(有意愿的小伙伴可以和我沟通交流一下~)
研究了c代码发现异常输出都是通过
1 fprintf(stderr, "xxxxx")
此类形式输出的,搜索一下,查看了前辈的文章()发现输出流是有讲究的,不是全部通过output通道发送的。
于是困扰了我两天的问题解决方案如下:
1 /// <summary> 2 /// 调用exe核心代码 3 /// </summary> 4 /// <param name="exefilename"></param> 5 /// <param name="args"></param> 6 public void runexe(string exefilename, string args = "") 7 { 8 try 9 { 10 11 process p = new process(); 12 13 p.startinfo = new processstartinfo(exefilename, args); 14 15 p.startinfo.arguments = args; 16 //p.startinfo.workingdirectory = @"c:\mingw\msys\1.0\home\61125\wfdb-10.6.1\build\bin"; 17 p.startinfo.useshellexecute = false; 18 19 p.startinfo.redirectstandardoutput = true; 20 21 //p.startinfo.redirectstandardinput = true; 22 23 p.startinfo.redirectstandarderror = true; 24 25 p.startinfo.createnowindow = false; 26 //绑定事件 27 p.outputdatareceived += new datareceivedeventhandler(p_outputdatareceived); 28 p.errordatareceived += p_errordatareceived; 29 30 p.start(); 31 p.beginoutputreadline();//开始读取输出数据 32 p.beginerrorreadline();//开始读取错误数据,重要! 33 p.waitforexit(); 34 p.close(); 35 } 36 catch (exception e) 37 { 38 console.writeline(e); 39 throw; 40 } 41 }
加入一行关键的
p.beginerrorreadline();//开始读取错误数据,重要!
就解决了问题。
emmmm。。(lll¬ω¬)
仅以此篇随笔防止其他小伙伴和我一样走弯路≡(▔﹏▔)≡