protected virtual void ProcessOnExited(object sender, EventArgs e) { if (!_exitedEventPublished) { // this boolean does not seem useful but i have seen weird behaviors where the // exited event is called twice when we WaitForExit(), better safe than sorry _exitedEventPublished = true; _cancelRegistration?.Dispose(); OnProcessExit?.Invoke(sender, e); } }
private ProcessInfo CreateProcess(string clientPath, string arguments, string logPipeName) { var processStartInfo = new ProcessStartInfo { FileName = clientPath, Arguments = arguments, UseShellExecute = false, }; var clientBinDirectory = _fs.Path.GetDirectoryName(_fs.Path.GetFullPath(clientPath)); if (clientBinDirectory != null) { processStartInfo.WorkingDirectory = clientBinDirectory; _logger.Log($"Setting client working directory to: '{clientBinDirectory}'"); } else { _logger.Log($"Failed to get client working directory from path: '{clientPath}'"); } var process = new Process { StartInfo = processStartInfo, EnableRaisingEvents = true, }; foreach (var kp in _env) { processStartInfo.EnvironmentVariables[kp.Key] = kp.Value; } var namedPipeToLog = new NamedPipeToLog(_logger, logPipeName); process.Exited += (sender, eventArgs) => { OnProcessExit?.Invoke(process); namedPipeToLog.Close(); _logger.Log($"Process {process.Id} has exited"); }; if (!process.Start()) { _logger.Log("Failed to start process"); return(null); } namedPipeToLog.LogPrefix = $"(Pid: {process.Id}) "; namedPipeToLog.StartLogging(); return(new ProcessInfo { Process = process }); }
private void ProcWatcher(object sender, DoWorkEventArgs e) { Dictionary <int, MonkeyProc> knownProcs = new Dictionary <int, MonkeyProc>(); foreach (MonkeyProc p in MonkeyProc.GetProcesses()) { knownProcs.Add(p.Id, p); } while (!Cancel) { Thread.Sleep(100); // don't hog all the cpu var current = MonkeyProc.GetProcesses(); var closed = knownProcs.Values.Except(current, MonkeyProc.ProcessComparer).ToArray(); // 3-21-15 Again, make a copy. The foreach iterator won't be const otherwise if (OnProcessExit == null) { foreach (MonkeyProc p in closed) { knownProcs.Remove(p.Id); } } else { foreach (MonkeyProc p in closed) { OnProcessExit.Invoke(p, EventArgs.Empty); knownProcs.Remove(p.Id); } } if (OnProcessStart != null) { foreach (MonkeyProc p in current) { if (!knownProcs.ContainsKey(p.Id)) { OnProcessStart.Invoke(p, EventArgs.Empty); knownProcs.Add(p.Id, p); } } } } e.Cancel = true; }
public void OnExit(object sender, EventArgs e) { var process = (IProcess)sender; lock (_processes) { if (!_processes.ContainsKey(process)) { return; } _processes.Remove(process); } OnProcessExit?.Invoke(process.StartInfo.FileName, process.ExitCode); process.Dispose(); }
private void Init() { AppDomain.CurrentDomain.UnhandledException += delegate(object sender, UnhandledExceptionEventArgs args) { var ex = (Exception)args.ExceptionObject; Console.WriteLine($"Exception caught by Global Exception Handler. {ex.Message}."); LogError($"Exception caught by Global Exception Handler", ex); OnUnHandledException?.Invoke(sender, args); if (args.IsTerminating) { Environment.Exit(0); } }; AppDomain.CurrentDomain.ProcessExit += delegate(object sender, EventArgs args) { OnProcessExit?.Invoke(sender, args); }; }
private ProcessInfo CreateProcess(string clientPath, string arguments, string logPipeName) { var process = new Process { StartInfo = { FileName = clientPath, Arguments = arguments, UseShellExecute = false }, EnableRaisingEvents = true, }; var namedPipeToLog = new NamedPipeToLog(_logger, logPipeName); process.Exited += (sender, eventArgs) => { OnProcessExit?.Invoke(process); namedPipeToLog.Close(); _logger.Log($"Process {process.Id} has exited"); }; if (!process.Start()) { _logger.Log("Failed to start process"); return(null); } namedPipeToLog.LogPrefix = $"(Pid: {process.Id}) "; namedPipeToLog.StartLogging(); return(new ProcessInfo { Process = process }); }
private void InitCallbacks() { m_callbacksArray = new Dictionary <ManagedCallbackType, DebugEventHandler <CorEventArgs> > { { ManagedCallbackType.OnBreakpoint, (sender, args) => OnBreakpoint?.Invoke(sender, (BreakpointEventArgs)args) }, { ManagedCallbackType.OnStepComplete, (sender, args) => OnStepComplete?.Invoke(sender, (StepCompleteEventArgs)args) }, { ManagedCallbackType.OnBreak, (sender, args) => OnBreak?.Invoke(sender, (ThreadEventArgs)args) }, { ManagedCallbackType.OnException, (sender, args) => OnException?.Invoke(sender, (ExceptionEventArgs)args) }, { ManagedCallbackType.OnEvalComplete, (sender, args) => OnEvalComplete?.Invoke(sender, (EvalEventArgs)args) }, { ManagedCallbackType.OnEvalException, (sender, args) => OnEvalException?.Invoke(sender, (EvalEventArgs)args) }, { ManagedCallbackType.OnCreateProcess, (sender, args) => OnCreateProcess?.Invoke(sender, (ProcessEventArgs)args) }, { ManagedCallbackType.OnProcessExit, (sender, args) => OnProcessExit?.Invoke(sender, (ProcessEventArgs)args) }, { ManagedCallbackType.OnCreateThread, (sender, args) => OnCreateThread?.Invoke(sender, (ThreadEventArgs)args) }, { ManagedCallbackType.OnThreadExit, (sender, args) => OnThreadExit?.Invoke(sender, (ThreadEventArgs)args) }, { ManagedCallbackType.OnModuleLoad, (sender, args) => OnModuleLoad?.Invoke(sender, (ModuleEventArgs)args) }, { ManagedCallbackType.OnModuleUnload, (sender, args) => OnModuleUnload?.Invoke(sender, (ModuleEventArgs)args) }, { ManagedCallbackType.OnClassLoad, (sender, args) => OnClassLoad?.Invoke(sender, (ClassEventArgs)args) }, { ManagedCallbackType.OnClassUnload, (sender, args) => OnClassUnload?.Invoke(sender, (ClassEventArgs)args) }, { ManagedCallbackType.OnDebuggerError, (sender, args) => OnDebuggerError?.Invoke(sender, (DebuggerErrorEventArgs)args) }, { ManagedCallbackType.OnLogMessage, (sender, args) => OnLogMessage?.Invoke(sender, (LogMessageEventArgs)args) }, { ManagedCallbackType.OnLogSwitch, (sender, args) => OnLogSwitch?.Invoke(sender, (LogSwitchEventArgs)args) }, { ManagedCallbackType.OnCreateAppDomain, (sender, args) => OnCreateAppDomain?.Invoke(sender, (AppDomainEventArgs)args) }, { ManagedCallbackType.OnAppDomainExit, (sender, args) => OnAppDomainExit?.Invoke(sender, (AppDomainEventArgs)args) }, { ManagedCallbackType.OnAssemblyLoad, (sender, args) => OnAssemblyLoad?.Invoke(sender, (AssemblyEventArgs)args) }, { ManagedCallbackType.OnAssemblyUnload, (sender, args) => OnAssemblyUnload?.Invoke(sender, (AssemblyEventArgs)args) }, { ManagedCallbackType.OnControlCTrap, (sender, args) => OnControlCTrap?.Invoke(sender, (ProcessEventArgs)args) }, { ManagedCallbackType.OnNameChange, (sender, args) => OnNameChange?.Invoke(sender, (ThreadEventArgs)args) }, { ManagedCallbackType.OnUpdateModuleSymbols, (sender, args) => OnUpdateModuleSymbols?.Invoke(sender, (UpdateModuleSymbolsEventArgs)args) }, { ManagedCallbackType.OnFunctionRemapOpportunity, (sender, args) => OnFunctionRemapOpportunity?.Invoke(sender, (FunctionRemapOpportunityEventArgs)args) }, { ManagedCallbackType.OnFunctionRemapComplete, (sender, args) => OnFunctionRemapComplete?.Invoke(sender, (FunctionRemapCompleteEventArgs)args) }, { ManagedCallbackType.OnBreakpointSetError, (sender, args) => OnBreakpointSetError?.Invoke(sender, (BreakpointEventArgs)args) }, { ManagedCallbackType.OnException2, (sender, args) => OnException2?.Invoke(sender, (Exception2EventArgs)args) }, { ManagedCallbackType.OnExceptionUnwind2, (sender, args) => OnExceptionUnwind2?.Invoke(sender, (ExceptionUnwind2EventArgs)args) }, { ManagedCallbackType.OnMDANotification, (sender, args) => OnMDANotification?.Invoke(sender, (MDAEventArgs)args) }, { ManagedCallbackType.OnExceptionInCallback, (sender, args) => OnExceptionInCallback?.Invoke(sender, (ExceptionInCallbackEventArgs)args) }, }; }
private static void CurrentDomain_ProcessExit(object sender, EventArgs e) { OnProcessExit?.Invoke(); }
/// <summary> /// Raises OnProcessExit event /// </summary> /// <param name="code">The exit code</param> /// <param name="command">Command name to be set to the args Content</param> private void RaiseProcessExitEvent(int code, string command) { OnProcessExit?.Invoke(this, new ProcessEventArgs(code, command)); }
/// <summary> /// Fires the process exit event. /// </summary> /// <param name="code">The code.</param> protected virtual void FireProcessExitEvent(int code) { // Get the event and fire it. OnProcessExit?.Invoke(this, new ConsoleStreamEventArgs(code)); }
private void Process_Exited(object sender, EventArgs e) { state = ProcessState.STOP; OnProcessExit?.Invoke(); }
/// <summary> /// Fires the process exit event. /// </summary> /// <param name="code">The code.</param> private void FireProcessExitEvent(int code) => OnProcessExit?.Invoke(this, new ProcessEventArgs(code));
/// <summary> /// Fires the process exit event. /// </summary> /// <param name="code">The code.</param> private void FireProcessExitEvent(int code) { // Get the event and fire it. OnProcessExit?.Invoke(this, new ProcessEventArgs(code)); }