C#如何与CMD控制台程序交互(读取和输入ReadtoEnd 会阻塞,如何解决),在线等。

sc_mmmm 2015-07-15 11:19:44
本来有一个c++的控制台程序,里面调用了封装好的API,通过各种命令进行交互。现在需要做一个c# winform的程序,因为改动API实在太麻烦 ,如何通过和控制台程序的交互,完成功能。
...全文
1219 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
mengwuxiy 2017-05-24
  • 打赏
  • 举报
回复
试了一下,异步方式比较靠谱
sc_mmmm 2015-07-16
  • 打赏
  • 举报
回复
这个问题我犯傻了,看了网上的加了个waitforexit().然后进程就死了。。 目前我已经决定用c#调用dll了,有点难度。不过还是谢谢大家的回答。
puler 2015-07-16
  • 打赏
  • 举报
回复
控制台经常遇到,阻塞跟失去响应的问题 觉得应该用【多线程】,使用【Process】,每个动作,打开一个CMD窗口(不显示即可)
effun 2015-07-16
  • 打赏
  • 举报
回复
可以用异步方法BeginOutputReadLine https://msdn.microsoft.com/en-us/library/system.diagnostics.process.beginoutputreadline(v=vs.110).aspx
sc_mmmm 2015-07-15
  • 打赏
  • 举报
回复
不要沉下去好么,在线等
皮特胖胖 2015-07-15
  • 打赏
  • 举报
回复
一条命令执行一次ReadToEnd就够了,不需要一直读取,ReadToEnd之前可以设定一个等待时间,proc.WaitForExit(xxx),这样就不会阻塞了
sc_mmmm 2015-07-15
  • 打赏
  • 举报
回复
引用 3 楼 sp1234 的回复:
进程通讯,可以使用“命名管道、udp/tcp、共享内存”等多种专业通讯形式。不要只盯着人家的用户输入输出操作。
你好,很感谢你能提供一个抽象的方向。对于改动API的事情,因为我不太了解这个API,所以目前来说不可行。 对于我这种情况(有API提供,并且前人已经完成了对API的各种函数的调用,只是界面是c++的控制台程序。目前我需要用c#写出winform界面),我认为我有两种解决方法: 1,c#直接调用c++API的dll和lib 2,利用已写好的控制台程序,只和控制台进行交互,完成各种功能。 第一种:难度太大,对每个调用的类都需要重写,因为目前不太熟悉,所以暂时放弃。 第二种:目前最简单最快的解决方法。但是我想知道具体的解决办法,比如说对process建立管道来知流缓存的状态,具体实现希望能提供帮助,谢谢。
sc_mmmm 2015-07-15
  • 打赏
  • 举报
回复
引用 2 楼 hironpan 的回复:
用Process就可以啊

Dim proc As System.Diagnostics.Process
proc = New System.Diagnostics.Process
proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
proc.StartInfo.CreateNoWindow = True
proc.StartInfo.UseShellExecute = False
proc.StartInfo.RedirectStandardOutput = True
proc.StartInfo.FileName = "cmd.exe"
proc.StartInfo.WorkingDirectory = Environment.GetFolderPath(Environment.SpecialFolder.System)
proc.StartInfo.Arguments = "/c ping www.baidu.com"  '执行ping命令
proc.Start()
proc.WaitForExit()
MessageBox.Show(proc.StandardOutput.ReadToEnd)
你说的只能是ping之类的输一次,全部读取。而我的有标准输入,有标准输出。而process里面的output的readline()和readtoend都是不行的。readline不行因为不知道有几行,而readtoend不行是因为一直读取,导致阻塞。。
  • 打赏
  • 举报
回复
如果你觉得使用一个真正的通讯机制“太麻烦”,那么早就应该“改动API”了。
  • 打赏
  • 举报
回复
进程通讯,可以使用“命名管道、udp/tcp、共享内存”等多种专业通讯形式。不要只盯着人家的用户输入输出操作。
皮特胖胖 2015-07-15
  • 打赏
  • 举报
回复
用Process就可以啊

Dim proc As System.Diagnostics.Process
proc = New System.Diagnostics.Process
proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
proc.StartInfo.CreateNoWindow = True
proc.StartInfo.UseShellExecute = False
proc.StartInfo.RedirectStandardOutput = True
proc.StartInfo.FileName = "cmd.exe"
proc.StartInfo.WorkingDirectory = Environment.GetFolderPath(Environment.SpecialFolder.System)
proc.StartInfo.Arguments = "/c ping www.baidu.com"  '执行ping命令
proc.Start()
proc.WaitForExit()
MessageBox.Show(proc.StandardOutput.ReadToEnd)

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧