protected override void Execute(object sender, EventArgs e) { ThreadHelper.ThrowIfNotOnUIThread(); switch (_tyeServicesProvider.SelectedService) { case V1Service service: if (_tyeServicesProvider.IsAttachable(service)) { _debuggerAttacher.Attach(service.Replicas.Values); } break; case V1ReplicaStatus replica: if (_tyeServicesProvider.IsAttachable(replica)) { _debuggerAttacher.Attach(replica); } break; } }
protected override async Task ExecuteAsync(object sender, EventArgs e) { await _tyeServicesProvider.RefreshAsync(); await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(Package.DisposalToken); var dte = Package.GetService <SDTE, DTE2>(); var startupProjects = (Array)dte.Solution.SolutionBuild.StartupProjects; var solutionPath = Path.GetDirectoryName(dte.Solution.FileName); if (startupProjects == null || solutionPath == null) { _logger.Log("No startup projects available."); return; } var replicas = new List <V1ReplicaStatus>(); foreach (string projectPath in startupProjects) { // Combine the relative project path and the root of the solution to derive the full path of the project var normalizedProjectPath = Path.GetFullPath(Path.Combine(solutionPath, projectPath)); var service = _tyeServicesProvider.Services .Where(s => s.Description.RunInfo.Project != null) .FirstOrDefault(s => string.Equals(Path.GetFullPath(s.Description.RunInfo.Project), normalizedProjectPath, StringComparison.InvariantCultureIgnoreCase)); if (service != null && _tyeServicesProvider.IsAttachable(service)) { replicas.AddRange(service.Replicas.Values); } } _debuggerAttacher.Attach(replicas); }