using System; using System.Diagnostics; using System.IO; namespace Packager.Tasks { public abstract class ToolTask: Task, IDisposable { private Process _toolProcess; protected void LaunchTool(string toolPath, string args) { LogMessage(false, $"Launch {Path.GetFileName(toolPath)} {args}."); _toolProcess = new Process { StartInfo = { CreateNoWindow = true, FileName = toolPath, Arguments = args, WorkingDirectory = Path.GetDirectoryName(toolPath), UseShellExecute = false, RedirectStandardOutput = true, RedirectStandardError = true }, EnableRaisingEvents = true }; _toolProcess.OutputDataReceived += OutputMessageReceived; _toolProcess.ErrorDataReceived += ErrorMessageReceived; //m_toolProcess.Exited += new EventHandler(ProcessExited); _toolProcess.Start(); _toolProcess.BeginOutputReadLine(); _toolProcess.BeginErrorReadLine(); _toolProcess.WaitForExit(); ProcessExited(); } public void OutputMessageReceived(object sender, DataReceivedEventArgs e) { if(e.Data != null) LogMessage(false, e.Data); } public void ErrorMessageReceived(object sender, DataReceivedEventArgs e) { if(e.Data != null) LogMessage(true, e.Data); } public virtual void ProcessExited() { ErrorCode = _toolProcess.ExitCode; } public virtual void Dispose() { _toolProcess?.Dispose(); } } }