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/