Inheritance: BasicLaunchInfo
 public Task<ProcessExitResult> LaunchAndProcessAsync(LaunchAndProcessInfo info) {
     Contract.Requires<ArgumentNullException>(info != null);
     return default(Task<ProcessExitResult>);
 }
 static IDisposable SetupStandardOutput(LaunchAndProcessInfo info, ReactiveProcess process) {
     if (!info.StartInfo.RedirectStandardOutput)
         throw new InvalidOperationException("Not redirected output");
     var dsp = new CompositeDisposable();
     if (info.StandardOutputObs != null)
         dsp.Add(info.StandardOutputObs(process.StandardOutputObservable));
     if (info.StandardOutputAction != null)
         dsp.Add(process.StandardOutputObservable.Subscribe(data => info.StandardOutputAction(process, data)));
     return dsp;
 }
 public ProcessExitResult LaunchAndProcess(LaunchAndProcessInfo info)
     => LaunchAndProcessAsync(info).WaitAndUnwrapException();
 public async Task<ProcessExitResult> LaunchAndProcessAsync(LaunchAndProcessInfo info) {
     using (var process = new ReactiveProcess {StartInfo = info.StartInfo.EnableRedirect()}) {
         using (SetupStandardOutput(info, process))
         using (SetupStandardError(info, process))
             return
                 await
                     LaunchAndWaitForExitAsync(process, info.MonitorOutput, info.MonitorResponding,
                             info.CancellationToken)
                         .ConfigureAwait(false);
     }
 }