Проверьте, открыт ли проект в 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.