У меня есть несколько инструментов, которые выполняют обновления решений .NET, но им нужно знать каталог, в котором находится решение.
Я добавил эти инструменты в качестве Внешних инструментов, где они появляются в меню Инструменты IDE, и предоставил $(SolutionDir)
в качестве аргумента. Это отлично работает.
Однако я хочу, чтобы к этим инструментам было проще получить доступ в IDE для пользователя через пользовательское меню верхнего уровня (для которого я создал проект пакета интеграции Visual Studio) и через контекстное меню на узлах решения (для которых я создал проект надстройки Visual Studio). Я ищу способ получить текущий каталог решений в этих контекстах.
Я попытался получить информацию о решении от объекта VisualStudio.DTE
:
EnvDTE.DTE dte = (EnvDTE.DTE)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE");
string solutionDir = System.IO.Path.GetDirectoryName(dte.Solution.FullName);
Но это возвращает каталог решения для надстроек, а не текущее решение.
Я попытался повторить $(SolutionDir)
и прочитать его обратно:
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();
Но это вернул каталог для IDE, а не текущее решение.
Я не увидел соответствующей информации в узле решения CommandBar
.
В качестве альтернативы, если бы существовал способ программно получить доступ к определенным внешним инструментам Visual Studio и запустить их (с помощью уже определенных макро-аргументов), это сработало бы.
Какое решение?