diff --git a/AttachToDockerContainer.csproj b/AttachToDockerContainer.csproj index db68d1b..6aadf63 100644 --- a/AttachToDockerContainer.csproj +++ b/AttachToDockerContainer.csproj @@ -53,6 +53,7 @@ AttachToDockerContainerDialog.xaml + diff --git a/AttachToDockerContainerDialog.xaml.cs b/AttachToDockerContainerDialog.xaml.cs index 37f5620..38cad1f 100644 --- a/AttachToDockerContainerDialog.xaml.cs +++ b/AttachToDockerContainerDialog.xaml.cs @@ -3,6 +3,7 @@ using System.Windows; using System.Windows.Controls; using System.Windows.Threading; +using AttachToDockerContainer.Utils; using Microsoft.VisualStudio.PlatformUI; using Microsoft.VisualStudio.Shell; using Microsoft.VisualStudio.Shell.Interop; @@ -54,6 +55,15 @@ private void AttachButton_Click(object sender, RoutedEventArgs e) Close(); } + private string GetProcessIdOfContainer(string containerName) + { + string projectsNames = string.Join(" ", IDEUtils.GetNameOfProjects()); + if (string.IsNullOrEmpty(projectsNames)) + return null; + + return DockerCli.Execute($"exec -it {containerName} pidof {projectsNames}"); + } + private void ContainerComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e) { Action action = () => UpdateDotNetPIDs(); @@ -69,7 +79,9 @@ private void UpdateDotNetPIDs() if (string.IsNullOrWhiteSpace(containerName)) return; - var pidofResult = DockerCli.Execute($"exec -it {containerName} pidof dotnet"); + var pidofResult = GetProcessIdOfContainer(containerName); + if (string.IsNullOrWhiteSpace(pidofResult)) + return; var dotnetPidsParsed = pidofResult .Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 2be25b3..e9521bd 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,5 +1,8 @@ -0.2 +0.2.2 +Updated to obtain the process ID using the project name of the container + +0.2 Add Process ID selection 0.1 -Initial release \ No newline at end of file +Initial release diff --git a/Utils/IDEUtils.cs b/Utils/IDEUtils.cs new file mode 100644 index 0000000..c0d2976 --- /dev/null +++ b/Utils/IDEUtils.cs @@ -0,0 +1,110 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using EnvDTE; +using EnvDTE80; +using Microsoft.VisualStudio; +using Microsoft.VisualStudio.Shell; +using Microsoft.VisualStudio.Shell.Interop; + +namespace AttachToDockerContainer.Utils +{ + public static class IDEUtils + { + private static readonly string vsProjectKindSolutionFolder = "{66A26720-8FB5-11D2-AA7E-00C04F688DDE}"; + + public static DTE2 GetActiveIDE() + { + DTE2 dte2 = Package.GetGlobalService(typeof(DTE)) as DTE2; + return dte2; + } + + private static IEnumerable GetSolutionFolderProjects(Project solutionFolder) + { + ThreadHelper.ThrowIfNotOnUIThread(); + List list = new List(); + for (var i = 1; i <= solutionFolder.ProjectItems.Count; i++) + { + var subProject = solutionFolder.ProjectItems.Item(i).SubProject; + if (subProject == null) + { + continue; + } + + if (subProject.Kind == vsProjectKindSolutionFolder) + { + list.AddRange(GetSolutionFolderProjects(subProject)); + } + else + { + list.Add(subProject); + } + } + return list; + } + + public static IList GetProjects() + { + ThreadHelper.ThrowIfNotOnUIThread(); + Projects projects = GetActiveIDE().Solution.Projects; + List list = new List(); + var item = projects.GetEnumerator(); + while (item.MoveNext()) + { + var project = item.Current as Project; + if (project == null) + { + continue; + } + + if (project.Kind == vsProjectKindSolutionFolder) + { + list.AddRange(GetSolutionFolderProjects(project)); + } + else + { + list.Add(project); + } + } + + return list; + } + + public static IEnumerable GetNameOfProjects() + { + return GetProjects().Select(p => + { + ThreadHelper.ThrowIfNotOnUIThread(); + return p.Name; + }); + } + + public static Project GetSelectedProject() + { + ThreadHelper.ThrowIfNotOnUIThread(); + + IVsMonitorSelection monitorSelection = + (IVsMonitorSelection) Package.GetGlobalService( + typeof(SVsShellMonitorSelection)); + + monitorSelection.GetCurrentSelection(out IntPtr hierarchyPointer, + out uint projectItemId, + out IVsMultiItemSelect multiItemSelect, + out IntPtr selectionContainerPointer); + + IVsHierarchy selectedHierarchy = Marshal.GetTypedObjectForIUnknown(hierarchyPointer, typeof(IVsHierarchy)) as IVsHierarchy; + + object selectedObject = null; + + if (selectedHierarchy != null) + { + ErrorHandler.ThrowOnFailure(selectedHierarchy.GetProperty(projectItemId, (int) __VSHPROPID.VSHPROPID_ExtObject, out selectedObject)); + } + + Project selectedProject = selectedObject as Project; + + return selectedProject; + } + } +} diff --git a/source.extension.vsixmanifest b/source.extension.vsixmanifest index 6f2ccd8..d2cbca6 100644 --- a/source.extension.vsixmanifest +++ b/source.extension.vsixmanifest @@ -1,7 +1,7 @@ - + Attach To Docker Container Extension to attach debugger to local docker container via vsdbg https://github.com/Dreamescaper/AttachToDockerContainer/