/// <summary>
        /// Executes the specified process info.
        /// </summary>
        /// <param name="processInfo">The process info.</param>
        /// <returns></returns>
        /// <remarks></remarks>
        public virtual ProcessResult Execute(ProcessInfo processInfo)
        {
            string projectName = Thread.CurrentThread.Name;

            using (RunnableProcess p = new RunnableProcess(processInfo, projectName, processInfo == null ? null : processInfo.PublicArguments))
            {
                p.ProcessOutput += ((sender, e) => OnProcessOutput(e));

                ProcessMonitor.MonitorProcessForProject(p.Process, projectName);
                ProcessResult run = p.Run();
                ProcessMonitor.RemoveMonitorForProject(projectName);
                return(run);
            }
        }
        /// <summary>
        /// Executes the specified process info.
        /// </summary>
        /// <param name="processInfo">The process info.</param>
        /// <param name="projectName">Name of the project.</param>
        /// <param name="itemId">The item id.</param>
        /// <param name="outputFile">The output file.</param>
        /// <returns>
        /// The result of the execution.
        /// </returns>
        public virtual ProcessResult Execute(ProcessInfo processInfo, string projectName, string itemId, string outputFile)
        {
            using (var p = new RunnableProcess(
                       this.FileSystem,
                       processInfo,
                       projectName,
                       itemId))
            {
                p.ProcessOutput += ((sender, e) => OnProcessOutput(e));

                ProcessMonitor.MonitorProcessForProject(projectName, itemId, p.Process);
                var run = p.Run(outputFile);
                ProcessMonitor.RemoveMonitorForProject(projectName, itemId);
                return(run);
            }
        }