/// <inheritdoc /> public AttachDebuggerResult AttachToProcess(Process process) { if (process == null) { throw new ArgumentNullException("process"); } AttachDebuggerResult result = AttachDebuggerResult.CouldNotAttach; try { IVisualStudio visualStudio = GetVisualStudio(true, logger); if (visualStudio != null) { visualStudio.Call(dte => { EnvDTE.Process dteProcess = FindProcess(dte.Debugger.DebuggedProcesses, process); if (dteProcess != null) { result = AttachDebuggerResult.AlreadyAttached; } else { dteProcess = FindProcess(dte.Debugger.LocalProcesses, process); if (dteProcess != null) { Process2 dteProcess2 = dteProcess as Process2; Debugger2 dteDebugger2 = dte.Debugger as Debugger2; if (dteProcess2 != null && dteDebugger2 != null) { IList <Guid> engineGuids = GetEngineGuids(); Engine[] engines = GetEngines(dteDebugger2, engineGuids); dteProcess2.Attach2(engines); } else { dteProcess.Attach(); } result = AttachDebuggerResult.Attached; } else { logger.Log(LogSeverity.Debug, "Failed to attach Visual Studio debugger to process because it was not found in the LocalProcesses list."); } } }); } } catch (VisualStudioException ex) { logger.Log(LogSeverity.Debug, "Failed to attach Visual Studio debugger to process.", ex); } return(result); }
private static bool AttachToProcess(Process processOutput, EnvDTE.Process process, Guid[] engines = null) { // Retry the attach itself 3 times before displaying a Retry/Cancel // dialog to the user. var dte = process.DTE; dte.SuppressUI = true; try { try { if (engines == null) { process.Attach(); } else { var process3 = process as EnvDTE90.Process3; if (process3 == null) { return(false); } process3.Attach2(engines.Select(engine => engine.ToString("B")).ToArray()); } return(true); } catch (COMException) { if (processOutput.WaitForExit(500)) { // Process exited while we were trying return(false); } } } finally { dte.SuppressUI = false; } // Another attempt, but display UI. process.Attach(); return(true); }