public PipelineStdHandleCreator(ref ChildProcessStartInfoInternal startInfo) { var stdInputRedirection = startInfo.StdInputRedirection; var stdOutputRedirection = startInfo.StdOutputRedirection; var stdErrorRedirection = startInfo.StdErrorRedirection; var stdInputFile = startInfo.StdInputFile; var stdOutputFile = startInfo.StdOutputFile; var stdErrorFile = startInfo.StdErrorFile; var stdInputHandle = startInfo.StdInputHandle; var stdOutputHandle = startInfo.StdOutputHandle; var stdErrorHandle = startInfo.StdErrorHandle; if (stdInputRedirection == InputRedirection.Handle && stdInputHandle == null) { throw new ArgumentException($"{nameof(ChildProcessStartInfo.StdInputHandle)} must not be null.", nameof(startInfo)); } if (stdInputRedirection == InputRedirection.File && stdInputFile == null) { throw new ArgumentException($"{nameof(ChildProcessStartInfo.StdInputFile)} must not be null.", nameof(startInfo)); } if (stdOutputRedirection == OutputRedirection.Handle && stdOutputHandle == null) { throw new ArgumentException($"{nameof(ChildProcessStartInfo.StdOutputHandle)} must not be null.", nameof(startInfo)); } if (IsFileRedirection(stdOutputRedirection) && stdOutputFile == null) { throw new ArgumentException($"{nameof(ChildProcessStartInfo.StdOutputFile)} must not be null.", nameof(startInfo)); } if (stdErrorRedirection == OutputRedirection.Handle && stdErrorHandle == null) { throw new ArgumentException($"{nameof(ChildProcessStartInfo.StdErrorHandle)} must not be null.", nameof(startInfo)); } if (IsFileRedirection(stdErrorRedirection) && stdErrorFile == null) { throw new ArgumentException($"{nameof(ChildProcessStartInfo.StdErrorFile)} must not be null.", nameof(startInfo)); } bool redirectingToSameFile = IsFileRedirection(stdOutputRedirection) && IsFileRedirection(stdErrorRedirection) && stdOutputFile == stdErrorFile; if (redirectingToSameFile && stdErrorRedirection != stdOutputRedirection) { throw new ArgumentException( "StdOutputRedirection and StdErrorRedirection must be the same value when both stdout and stderr redirect to the same file.", nameof(startInfo)); } try { if (stdInputRedirection == InputRedirection.InputPipe) { (InputStream, _inputReadPipe) = FilePal.CreatePipePairWithAsyncServerSide(System.IO.Pipes.PipeDirection.Out); } if (stdOutputRedirection == OutputRedirection.OutputPipe || stdErrorRedirection == OutputRedirection.OutputPipe) { (OutputStream, _outputWritePipe) = FilePal.CreatePipePairWithAsyncServerSide(System.IO.Pipes.PipeDirection.In); } if (stdOutputRedirection == OutputRedirection.ErrorPipe || stdErrorRedirection == OutputRedirection.ErrorPipe) { (ErrorStream, _errorWritePipe) = FilePal.CreatePipePairWithAsyncServerSide(System.IO.Pipes.PipeDirection.In); } PipelineStdIn = ChooseInput( stdInputRedirection, stdInputFile, stdInputHandle, _inputReadPipe, startInfo.CreateNewConsole); PipelineStdOut = ChooseOutput( stdOutputRedirection, stdOutputFile, stdOutputHandle, _outputWritePipe, _errorWritePipe, startInfo.CreateNewConsole); if (redirectingToSameFile) { PipelineStdErr = PipelineStdOut; } else { PipelineStdErr = ChooseOutput( stdErrorRedirection, stdErrorFile, stdErrorHandle, _outputWritePipe, _errorWritePipe, startInfo.CreateNewConsole); } } catch { Dispose(); throw; } }
public PipelineStdHandleCreator( InputRedirection stdInputRedirection, OutputRedirection stdOutputRedirection, OutputRedirection stdErrorRedirection, string stdInputFile, string stdOutputFile, string stdErrorFile, SafeFileHandle stdInputHandle, SafeFileHandle stdOutputHandle, SafeFileHandle stdErrorHandle) { if (stdInputRedirection == InputRedirection.Handle && stdInputHandle == null) { throw new ArgumentNullException(nameof(ChildProcessStartInfo.StdInputHandle)); } if (stdInputRedirection == InputRedirection.File && stdInputFile == null) { throw new ArgumentNullException(nameof(ChildProcessStartInfo.StdInputFile)); } if (stdOutputRedirection == OutputRedirection.Handle && stdOutputHandle == null) { throw new ArgumentNullException(nameof(ChildProcessStartInfo.StdOutputHandle)); } if (IsFileRedirection(stdOutputRedirection) && stdOutputFile == null) { throw new ArgumentNullException(nameof(ChildProcessStartInfo.StdOutputFile)); } if (stdErrorRedirection == OutputRedirection.Handle && stdErrorHandle == null) { throw new ArgumentNullException(nameof(ChildProcessStartInfo.StdErrorHandle)); } if (IsFileRedirection(stdErrorRedirection) && stdErrorFile == null) { throw new ArgumentNullException(nameof(ChildProcessStartInfo.StdErrorFile)); } bool redirectingToSameFile = IsFileRedirection(stdOutputRedirection) && IsFileRedirection(stdErrorRedirection) && stdOutputFile == stdErrorFile; if (redirectingToSameFile && stdErrorRedirection != stdOutputRedirection) { throw new ArgumentException( "StdOutputRedirection and StdErrorRedirection must be the same value when both stdout and stderr redirect to the same file.", nameof(ChildProcessStartInfo.StdErrorRedirection)); } try { if (stdInputRedirection == InputRedirection.InputPipe) { (this.InputStream, _inputReadPipe) = FilePal.CreatePipePairWithAsyncServerSide(System.IO.Pipes.PipeDirection.Out); } if (stdOutputRedirection == OutputRedirection.OutputPipe || stdErrorRedirection == OutputRedirection.OutputPipe) { (this.OutputStream, _outputWritePipe) = FilePal.CreatePipePairWithAsyncServerSide(System.IO.Pipes.PipeDirection.In); } if (stdOutputRedirection == OutputRedirection.ErrorPipe || stdErrorRedirection == OutputRedirection.ErrorPipe) { (this.ErrorStream, _errorWritePipe) = FilePal.CreatePipePairWithAsyncServerSide(System.IO.Pipes.PipeDirection.In); } this.PipelineStdIn = ChooseInput( stdInputRedirection, stdInputFile, stdInputHandle, _inputReadPipe); this.PipelineStdOut = ChooseOutput( stdOutputRedirection, stdOutputFile, stdOutputHandle, _outputWritePipe, _errorWritePipe); if (redirectingToSameFile) { this.PipelineStdErr = this.PipelineStdOut; } else { this.PipelineStdErr = ChooseOutput( stdErrorRedirection, stdErrorFile, stdErrorHandle, _outputWritePipe, _errorWritePipe); } } catch { Dispose(); throw; } }