public static void Shell(string path, string args, Action <ITestShell> action) { using (var disposer = new Disposer()) { var process = new DaemonProcess(new DaemonProcess.Args { Executable = path, Arguments = args, }); Logger.Trace("Shell process {0} {1}", process.Id, process.Name, process.Info.FileName); Logger.Trace("Shell path {0}", process.Info.FileName); Logger.Trace("Shell args {0}", process.Info.Arguments); var shell = new TestShell(); var reader = new Runner(new Runner.Args { ThreadName = "SDTOUT" }); var erroer = new Runner(new Runner.Args { ThreadName = "STDERR" }); var writer = new Runner(new Runner.Args { ThreadName = "STDIN" }); reader.Run(() => { var line = process.ReadLine(); while (line != null) { Logger.Trace("<o {0}", line); shell.WriteLine("<o {0}", line); line = process.ReadLine(); } shell.WriteLine(Environ.NewLines); }); erroer.Run(() => { var line = process.ReadError(); while (line != null) { Logger.Trace("<e {0}", line); shell.WriteLine("<e {0}", line); line = process.ReadError(); } }); writer.Run(() => { var line = shell.ReadLine(); while (line != null) { Logger.Trace("i> {0}", line); process.WriteLine(line); line = shell.ReadLine(); } }); disposer.Push(erroer); disposer.Push(reader); disposer.Push(process); disposer.Push(writer); disposer.Push(shell); action(shell); } }