Пробуем разные методы межпроцессного взаимодействия.
У меня есть приложение С#, которое порождает процесс ruby и перенаправляет stdin и stdout процесса ruby, чтобы приложение C # могло отправлять инструкции процессу 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#.
Когда я запускаю приложение С#, оно выводит «Тестовая команда получена!» как и ожидалось.
Однако вызывает сомнения тот факт, что я закрываю стандартный ввод процесса... что означает, что я больше не могу писать в него.
Если я уберу close
, он просто зависнет. Предположительно, потому что Ruby не получает ожидаемого символа, который говорит ему прекратить чтение.
Если я использую flush
, это не имеет значения.
В чем проблема с этим обменом?
Есть ли в C# другой способ отправки данных в STDIN ruby?
Должен ли Ruby читать из STDIN по-другому?