【问题标题】:How to read/write to Process input/output in C#如何在 C# 中读取/写入进程输入/输出
【发布时间】:2012-10-23 20:31:49
【问题描述】:

我有一个控制台应用程序,它提示我想通过 Windows 窗体应用程序的 System.Diagnostics.Process.Start() 方法从 C# 调用的各种信息,但我不能让它正常工作.举个简单的例子,假设我想通过 Windows 窗体应用程序捕获 FirstName 和 LastName,然后像这样动态地将它们传递给控制台应用程序:

  1. Forms 应用程序启动,用户键入名字和姓氏的值,然后单击按钮提交
  2. 它为控制台应用调用 Process.Start
  3. 控制台应用程序写出“输入您的名字”
  4. Forms 应用程序读取此提示,确定它需要使用它收集的 FirstName 值进行响应,并将其写入控制台应用程序的输出
  5. 控制台应用程序接受输入并响应下一个提示“输入您的姓氏”
  6. Forms 应用程序读取此提示,确定它需要使用它收集的 LastName 值进行响应,并将其写入控制台应用程序的输出
  7. 控制台应用程序现在拥有所需的所有信息,并继续愉快地进行

感谢您的任何见解,这不是我经常合作的领域

【问题讨论】:

  • 那么问题是什么?哦,你必须在那个庄园里做吗,或者有可能重新设计一下吗?
  • 为什么不一开始就将参数传递给控制台应用程序,除非您有令人信服的理由这样做。
  • @swiftgp 如果您可以选择根本不应该调用控制台应用程序,那么控制台应用程序和表单应用程序都应该是类库中功能的两个不同 UI 前端。当然,如果可执行文件是第 3 方应用程序而不是他自己的应用程序,那么我们的两个想法都可能落空。

标签: c# .net process system.diagnostics


【解决方案1】:

在 WinForms 应用中,您可以使用 Process.StandardOutput 属性返回的 StreamReader 从控制台应用读取输出,并使用 Process.StandardInput 属性返回的 StreamWriter 将输入写入控制台应用。

顺便说一句,您是否自己开发了控制台应用程序(或拥有项目文件)?如果是这样,我建议使用更好的 IPC 形式,例如使控制台应用程序成为 EXE 的 DLL,或者使用来自 WCF 的东西或类似的东西。

【讨论】:

    【解决方案2】:

    查看Process.StandardOutputProcess.StandardInputProcess.StandardError

    您需要阅读Process.StandardOutput。当你读到“'输入你的名字””时,你把名字写到Process.StandardInput等等。

    请注意,子进程也可以写入其StandardError,您可能需要在不同的线程中读取它,以便您可以同时从两者读取

    Java 中有expect4j 让这一切变得简单。我很确定我在 .net 上看到了一些东西,但我现在找不到。

    编辑:Creating a Child Process with Redirected Input and Output 似乎是 MSDN 上关于此主题的一篇好文章

    【讨论】:

    • 是的,我查看了 StandardInput 和 StandardOutput 属性,并试图让它与在线发布的一些测试代码一起工作。问题是,当我在进程中调用 Start 时,它只会触发并且不会等待输入......所以虽然它会成功读取提示,但控制台应用程序似乎并没有等待输入跨度>
    • 这不太可能,如果它在命令行上执行时等待输入,那么从另一个进程启动时它应该做同样的事情。从使用控制(表单)进程和子进程的较小样本开始。
    猜你喜欢
    • 2022-01-15
    • 1970-01-01
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-15
    • 1970-01-01
    相关资源
    最近更新 更多