C# 使用ProcessStartInfo调用exe获取不到重定向数据的解决方案
emmmmm,最近在研究WFDB工具箱,C语言写的,无奈本人C语言功底不够,只想直接拿来用,于是打算通过ProcessStartInfo来调取编译出来的exe程序获取输出。
一开始就打算偷懒,从园子里的前辈blog上偷来部分代码,和着自己写的代码差不多就写了以下调取程序的代码:
/// <summary>
/// 调用Exe核心代码
/// </summary>
/// <param name="exeFileName"></param>
/// <param name="args"></param>
public void RunExe(string exeFileName, string args = "")
{
try
{ Process p = new Process(); p.StartInfo = new ProcessStartInfo(exeFileName, args); p.StartInfo.Arguments = args;
//p.StartInfo.WorkingDirectory = @"C:\MinGW\msys\1.0\home\61125\wfdb-10.6.1\build\bin";
p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardOutput = true; //p.StartInfo.RedirectStandardInput = true; p.StartInfo.RedirectStandardError = true; p.StartInfo.CreateNoWindow = false;
//绑定事件
p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);
p.ErrorDataReceived += P_ErrorDataReceived; p.Start();
p.BeginOutputReadLine();//开始读取输出数据
p.WaitForExit();
p.Close();
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
}
然后使用时发现了问题,按照wfdb 中app的设计,直接调取exe是会弹出help内容的,可是我自己调用却不行。
无奈自己就搭建C环境,MinGw配合Visual Code配置了一把,踩了好多坑,才在windows环境下跑起了wfdb并能够调试。具体坑就不谈了。(有意愿的小伙伴可以和我沟通交流一下~)
研究了C代码发现异常输出都是通过
fprintf(stderr, "xxxxx")
此类形式输出的,搜索一下,查看了前辈的文章(https://www.cnblogs.com/tshua/p/5730658.html)发现输出流是有讲究的,不是全部通过Output通道发送的。
于是困扰了我两天的问题解决方案如下:
/// <summary>
/// 调用Exe核心代码
/// </summary>
/// <param name="exeFileName"></param>
/// <param name="args"></param>
public void RunExe(string exeFileName, string args = "")
{
try
{ Process p = new Process(); p.StartInfo = new ProcessStartInfo(exeFileName, args); p.StartInfo.Arguments = args;
//p.StartInfo.WorkingDirectory = @"C:\MinGW\msys\1.0\home\61125\wfdb-10.6.1\build\bin";
p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardOutput = true; //p.StartInfo.RedirectStandardInput = true; p.StartInfo.RedirectStandardError = true; p.StartInfo.CreateNoWindow = false;
//绑定事件
p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);
p.ErrorDataReceived += P_ErrorDataReceived; p.Start();
p.BeginOutputReadLine();//开始读取输出数据
p.BeginErrorReadLine();//开始读取错误数据,重要!
p.WaitForExit();
p.Close();
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
}
加入一行关键的
p.BeginErrorReadLine();//开始读取错误数据,重要!
就解决了问题。
emmmm。。(lll¬ω¬)
仅以此篇随笔防止其他小伙伴和我一样走弯路≡(▔﹏▔)≡
C# 使用ProcessStartInfo调用exe获取不到重定向数据的解决方案的更多相关文章
- vc++调用exe获取输出信息
目的 调用命令行程序,返回结果. 思路 把命令行结果输入到管道中,exe的输出信息都存在了strOutput这个变量里. 实现代码 CString strCmd = L"yara64.exe ...
- python调用tushare获取股票月线数据
接口:monthly 描述:获取A股月线数据 限量:单次最大3700,总量不限制 积分:用户需要至少300积分才可以调取,具体请参阅本文最下方积分获取办法 注:tushare库下载和初始化教程,请查阅 ...
- 使用java传参调用exe并且获取程序进度和返回结果的一种方法
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 在某个项目中需要考虑使用java后台调用由C#编写的切图程序( ...
- C#调用EXE
1.问题意义 据说界面程序开发,首选C#(像lebview之类的也很好) 但是,能不能用其他语言开发核心代码,只用C#做界面?毕竟每种语言都有自己擅长的领域. 2.exe程序 比如有个example. ...
- C#调用exe文件,IIS发布后无法掉用本地exe程序的解决方法
http://blog.csdn.net/junjieking/article/details/6277836?reload这位楼主的问题,我也遇到了,但是我按照他那样操作并没有解决问题,弄了好久终于 ...
- 在C#中调用EXE文件
1. 如果exe文件的返回值是int类型,标识操作执行的结果是否成功,例如: class Program { static int Main(string[] args) { return args. ...
- C#调用Exe文件的方法及如何判断程序调用的exe已结束
很简单的代码就可以实现C#调用EXE文件,如下: 引入using System.Diagnostics; 调用代码: Process.Start(exe文件名); 或直接 System.Diagnos ...
- C#调用Exe程序示例
在编写程序时经常会使用到调用可执行程序的情况,本文将简单介绍C#调用exe的方法.在C#中,通过Process类来进行进程操作. Process类在System.Diagnostics包中. 示例一 ...
- java调用exe
前言:最近做了一个Java跨平台开启,关闭,重启nginx的功能,在Java操作exe上遇到了一些问题,下面是对这个问题一个总结 一.Java操作exe的三种方式 (1)Runtime.getRunt ...
随机推荐
- Linux操作系统-基本命令(一)
熟悉Linux命令基础 Linux系统的终端窗口 字符终端为用户提供了一个标准的命令行接口,在字符终端窗口中,会显示一个Shell提示符,通常为$. 用户可以在提示符后输入带有选项和参数的字符命令,并 ...
- mongodb聚合 group
MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果.有点类似sql语句中的 count(*). 基本语法为:db.collection.agg ...
- SQOOP 添加oracle 驱动
我的ORACLE 是11G ,找到ojdbc6.jar,放到sqoop 的lib 下面,我的是cloudera 集群,目录是 /opt/cloudera/parcels/CDH-5.10.0-1 ...
- 并发服务器和HTTP协议
单进程服务器 1. 完成一个简单的TCP服务器 from socket import * serSocket = socket(AF_INET, SOCK_STREAM) # 重复使用绑定的信息 se ...
- Django学习---原生ajax
Ajax 原生ajax Ajax主要就是使用 [XmlHttpRequest]对象来完成请求的操作,该对象在主流浏览器中均存在(除早起的IE),Ajax首次出现IE5.5中存在(ActiveX控件). ...
- 温故而知新-strtok函数
温故而知新-strtok函数 记得之前没见过这个函数,是把字符串分割成更小的字符串 来个例子就是比较鲜明了 $string = "Hello world. Beautiful day tod ...
- 记录一些sql,怕忘了
SELECT business_line,count(*) FROM zc_db.t_bug group by business_line; 这个是展示的,显示某一项一共有多少个xxx,注意是grou ...
- linux下实时查看log
1.先切换到:cd usr/local/tomcat5/logs2.tail -f catalina.out3.这样运行时就可以实时查看运行日志了 Ctrl+c 是退出tail命令. 顺便讲一下lin ...
- python模块的打包
python模块的打包方法: http://blog.csdn.net/five3/article/details/7847551
- html 原生tab切换js
$("#ulId li").on('click', function () { $("#li-container").children().hide(); $( ...