Obtención programática del directorio actual de la solución IDE de Visual Studio desde complementos

Tengo algunas herramientas que realizan actualizaciones en soluciones .NET, pero necesitan conocer el directorio donde se encuentra la solución.

Agregué estas herramientas como herramientas externas, donde aparecen en el menú de herramientas IDE, y suministrando$(SolutionDir) como argumento Esto funciona bien.

Sin embargo, quiero que estas herramientas sean más fáciles de acceder en el IDE para el usuario a través de un menú de nivel superior personalizado (para el que creé un proyecto de paquete de integración de Visual Studio) y a través de un menú de contexto en los nodos de la solución (para los que creé un Visual Proyecto complemento de estudio). Estoy buscando una manera de obtener el directorio de la solución actual a través de estos contextos.

Traté de obtener la información de la solución de laVisualStudio.DTE objeto:

EnvDTE.DTE dte = (EnvDTE.DTE)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE");
string solutionDir = System.IO.Path.GetDirectoryName(dte.Solution.FullName);

Pero, esto devuelve el directorio de soluciones para los complementos, no la solución actual.

Intenté hacerme eco$(SolutionDir) y leyéndolo de nuevo:

System.Diagnostics.ProcessStartInfo procStartInfo = new System.Diagnostics.ProcessStartInfo("cmd", "echo $(SolutionDir)");

// The following commands are needed to redirect the standard output.
// This means that it will be redirected to the Process.StandardOutput StreamReader.
procStartInfo.RedirectStandardOutput = true;
procStartInfo.UseShellExecute = false;
// Do not create the black window.
procStartInfo.CreateNoWindow = true;
// Now we create a process, assign its ProcessStartInfo and start it
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo = procStartInfo;
proc.Start();
// Get the output into a string
string result = proc.StandardOutput.ReadToEnd();

Pero, esto devolvió el directorio para el IDE, no la solución actual.

No vi ninguna información relevante en el nodo de soluciónCommandBar.

Alternativamente, si hubiera una manera de acceder mediante programación a las herramientas externas definidas de Visual Studio e iniciarlas (usando los argumentos de macro ya definidos), eso funcionaría.

¿Cuál es la solución?

Respuestas a la pregunta(2)

Su respuesta a la pregunta