Проверьте, открыт ли проект в Visual Studio

Мне нужно открыть решение Visual Studio из Java-приложения, и я хочу убедиться, что этот проект VS еще не открыт, прежде чем открывать его.

Я думал о 2 решениях:

Во-первых, проверьте, не заблокирован ли файл VS .sln другим процессом (см. Ответы на этот вопрос). Проблема с этим решением заключается в том, что я не знаю, кто блокирует файл, это может быть любое другое приложение, такое как блокнот, проводник (при копировании) и т. Д.

Во-вторых, найдите работающие процессы VS и проверьте, было ли это конкретное решение отправлено одному из них в качестве аргумента (значение было открыто VS). Вот код:

Process p = Runtime.getRuntime().exec("wmic process where caption=\"devenv.exe\" get commandline");
BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
while ((line = input.readLine()) != null){
        if(line.trim().contains(solutionPath))
               //the VS solution is already open
      }

Проблема в том, что выход этого wmic Команда в форме: <devenv.exe path> <VS project path> и этот путь проекта VS может быть относительным, ссылаясь на файл проекта вместо файла решения и т. д. Например, если мне нужно открыть проект C:\Users\username\My Documents\Visual Studio 2012\Projects\ProjectName\ProjectName.sln и командная строка, которую я получаю от wmic "<devenv.exe path>" "C:\Users\username\Documents\Visual Studio 2012\Projects\ProjectName\ProjectName.vcxproj"оба пути относятся к одному и тому же проекту VS, но я не буду этого знать.

РЕДАКТИРОВАТЬ: я только что обнаружил, что Visual Studio не блокирует файл решения, когда он открыт, поэтому мое первое решение не применимо. и как вы можете видеть в комментариях ниже, второй вариант не подходит, так как проект, который был открыт или закрыт в VS, не будет отображаться правильно. Поэтому мне нужен другой способ.

Любая идея?

2 ответа

Не является надежным, но вы можете перечислить заголовки верхнего окна и проверить свое "SolutionName - Microsoft Visual Studio".

Visual Studio предоставляет интерфейс COM, который можно использовать для получения работающего экземпляра Visual Studio и проверки свойства dte.Solution.FullName. Смотрите, например, Получение экземпляра EnvDTE.DTE вне Visual Studio IDE.

Другие вопросы по тегам