public virtual bool Start(ProcessInfo info, BuildLogger buildLogger)
        {
            if (info == null)
            {
                throw new ArgumentNullException("info",
                                                "The process information cannot be null (Nothing).");
            }

            if (_process != null)
            {
                if (_process.HasExited == false)
                {
                    return(false);
                }

                _process.Dispose();
                _process = null;
            }

            try
            {
                _process = new Process();

                ProcessStartInfo startInfo = _process.StartInfo;

                startInfo.CreateNoWindow         = info.CreateNoWindow;
                startInfo.FileName               = info.FileName;
                startInfo.WorkingDirectory       = info.WorkingDirectory;
                startInfo.RedirectStandardOutput = info.RedirectOutput;
                startInfo.RedirectStandardError  = info.RedirectError;
                startInfo.UseShellExecute        = info.UseShellExecute;
                startInfo.Arguments              = info.Arguments;

                _process.EnableRaisingEvents = true;

                _process.ErrorDataReceived += new DataReceivedEventHandler(
                    OnProcessErrorReceived);
                _process.OutputDataReceived += new DataReceivedEventHandler(
                    OnProcessOutputReceived);
                _process.Exited += new EventHandler(OnProcessExited);

                _processInfo   = info;
                _processLogger = buildLogger;

                // Now, start the process - there will still not be output till...
                _startTime = DateTime.Now;

                _process.Start();

                // if we get here, send an event to the caller
                if (this.ProcessStarted != null)
                {
                    ProcessStartedEventArgs args = new
                                                   ProcessStartedEventArgs(_startTime, info);
                    this.ProcessStarted(this, args);
                }

                // Start the asynchronous read of the output stream
                _process.BeginErrorReadLine();
                _process.BeginOutputReadLine();

                // We must wait for the process to complete, if required...
                if (info.WaitForExit)
                {
                    _process.WaitForExit();
                }

                return(true);
            }
            catch (Exception ex)
            {
                if (_process != null)
                {
                    _process.Dispose();
                    _process = null;
                }
                if (buildLogger != null)
                {
                    buildLogger.WriteLine(ex, BuildLoggerLevel.Error);
                }

                return(false);
            }
        }
 public virtual bool Start(ProcessInfo info)
 {
     return(this.Start(info, null));
 }