diff --git a/src/Microsoft.TestPlatform.PlatformAbstractions/common/System/ProcessHelper.cs b/src/Microsoft.TestPlatform.PlatformAbstractions/common/System/ProcessHelper.cs index 119fb2f473..b7a869cfa1 100644 --- a/src/Microsoft.TestPlatform.PlatformAbstractions/common/System/ProcessHelper.cs +++ b/src/Microsoft.TestPlatform.PlatformAbstractions/common/System/ProcessHelper.cs @@ -50,7 +50,15 @@ public object LaunchProcess(string processPath, string arguments, string working { // Call WaitForExit again to ensure all streams are flushed var p = sender as Process; - p.WaitForExit(); + try + { + p.WaitForExit(); + } + catch (InvalidOperationException) + { + } + + // If exit callback has code that access Process object, ensure that the exceptions handling should be done properly. exitCallBack(p); }; } @@ -104,10 +112,16 @@ public string GetProcessName(int processId) public bool TryGetExitCode(object process, out int exitCode) { var proc = process as Process; - if (proc != null && proc.HasExited) + try + { + if (proc != null && proc.HasExited) + { + exitCode = proc.ExitCode; + return true; + } + } + catch (InvalidOperationException) { - exitCode = proc.ExitCode; - return true; } exitCode = 0; @@ -121,18 +135,24 @@ public void SetExitCallback(int processId, Action callbackAction) process.EnableRaisingEvents = true; process.Exited += (sender, args) => - { - callbackAction.Invoke(); - }; + { + callbackAction.Invoke(); + }; } /// public void TerminateProcess(object process) { var proc = process as Process; - if (proc != null && !proc.HasExited) + try + { + if (proc != null && !proc.HasExited) + { + proc.Kill(); + } + } + catch (InvalidOperationException) { - proc.Kill(); } } } diff --git a/src/Microsoft.TestPlatform.TestHostProvider/Hosting/TestHostManagerCallbacks.cs b/src/Microsoft.TestPlatform.TestHostProvider/Hosting/TestHostManagerCallbacks.cs index 2a4dd86d37..05ff0b1933 100644 --- a/src/Microsoft.TestPlatform.TestHostProvider/Hosting/TestHostManagerCallbacks.cs +++ b/src/Microsoft.TestPlatform.TestHostProvider/Hosting/TestHostManagerCallbacks.cs @@ -61,7 +61,16 @@ public static void ErrorReceivedCallback(StringBuilder testHostProcessStdError, EqtTrace.Error("Test host exited with error: '{0}'", testHostProcessStdErrorStr); } - onHostExited(new HostProviderEventArgs(testHostProcessStdErrorStr, exitCode, (process as Process).Id)); + int procId = -1; + try + { + procId = (process as Process).Id; + } + catch (InvalidOperationException) + { + } + + onHostExited(new HostProviderEventArgs(testHostProcessStdErrorStr, exitCode, procId)); } } }