public bool StartProcess()
        {
            if (IsCompiling)
            {
                return(false);
            }

            //TODO: What should we do if it is already running?
            lock (SyncObj)
            {
                //double check locking
                if (IsCompiling)
                {
                    return(false);
                }

                if (IsRunning)
                {
                    return(false);
                }

                DeployedProcess?.Dispose();

                ProcessStartInfo startInfo = new ProcessStartInfo(ProcessPath);
                startInfo.UseShellExecute  = false;
                startInfo.CreateNoWindow   = false;
                startInfo.WorkingDirectory = Path.GetDirectoryName(ProcessPath);
                DeployedProcess            = new Process()
                {
                    StartInfo = startInfo
                };
                DeployedProcess.EnableRaisingEvents = true;

                //By default we should restart if it exits.
                DeployedProcess.Exited += (sender, args) => StartProcess();

                return(DeployedProcess.Start());
            }
        }
 private void ShutdownProcess()
 {
     lock (SyncObj)
         DeployedProcess.Kill();
 }