如何使用stdin和stdout在C#和ruby进程之间进行通信

时间:2014-04-02 20:55:35

标签: c# ruby inter-process-communicat

尝试不同的进程间通信方法。

我有一个C#应用程序,它产生一个ruby进程并重定向ruby进程' stdin和stdout使得C#app可以向ruby进程发送指令,而ruby进程可以发回一些东西。

红宝石:

cmd = STDIN.read
p "Test command received!" if cmd.downcase == "test"

C#

static void Main(string[] args)
{
  ProcessStartInfo procInfo = new ProcessStartInfo("ruby");
  procInfo.Arguments = "stdinTest.rb";
  procInfo.UseShellExecute = false;
  procInfo.RedirectStandardInput = true;
  procInfo.RedirectStandardOutput = true;

  proc = new Process();
  proc.StartInfo = procInfo;
  proc.Start();
  proc.StandardInput.Write("test");
  proc.StandardInput.Close();

  Console.WriteLine(proc.StandardOutput.ReadLine());
}

这假设Ruby位于sys路径上,ruby脚本与C#app位于同一文件夹中。

当我运行C#应用程序时,它打印出"收到测试命令!"如预期的那样。

然而,有一件值得怀疑的事情就是我关闭了这个过程' stdin ...这意味着我不能再写信了。

如果我删除close,它就会挂起。大概是因为Ruby没有得到预期的字符,告诉它停止阅读。

如果我使用flush,则无法发挥作用。

这次交换有什么问题?
C#是否有不同的方式将数据发送到ruby的STDIN?
Ruby应该以不同的方式从STDIN读取吗?

1 个答案:

答案 0 :(得分:2)

STDIN是一个流,STDIN.read正在尝试读取流的末尾。首先发送您的数据长度并使用read长度:

数据包:0008ABCDEFGH(在现实生活中你应该使用二进制长度)

length = STDIN.read(4).to_i
data = STDIN.read(length)

然后你不必关闭它,并可以发送另一个数据包。