欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C# 使用ProcessStartInfo调用exe获取不到重定向数据的解决方案

程序员文章站 2022-06-30 11:50:08
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¬ω¬)

仅以此篇随笔防止其他小伙伴和我一样走弯路≡(▔﹏▔)≡