2015-12-28 6 views
0

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

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

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

Два, найдите запущенные процессы 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, но я этого не знаю.

EDIT: Я просто нашел, что Visual Studio не блокирует файл решения, когда он открыт, так что мое первое решение не применяется. и, как вы можете видеть в комментариях ниже, второй вариант не является вариантом, поскольку проект, открытый или закрытый в VS, не будет отображаться правильно. Поэтому мне нужно по-другому.

Любая идея?

+1

Со вторым вариантом, что произойдет, если вы запустили Visual Studio без аргументов, а затем открыли проект изнутри? Я не думаю, что это проявилось бы ... –

+0

Вы правы. И та же проблема будет, если я запустил Visual Studio с аргументами, а затем закрою проект изнутри - он будет показан в командной строке, хотя проект близок. Поэтому мне нужно другое решение. – user3114639

+0

Похоже, у вас мало выбора. В какой ситуации кто-то другой, помимо Visual Studio, имеет блокировку в файле проекта? –

ответ

0

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

+0

Очень ненадежный, поскольку заголовок окна включает только имя решения, а не полный путь, поэтому совсем не гарантируется, что это то же самое решение. – user3114639

0

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

+0

Прежде всего, обратите внимание, что код в этом примере находится в C# /. Net, и мне нужен Java-код. Кроме того, ответ там предлагает создать новый экземпляр Visual Studio, и это именно то, чего я хочу избежать ... – user3114639

+0

Извините, я не могу помочь с java-кодом. Вызов GetActiveObject не создает новый экземпляр VS, он возвращает ссылку на запущенный. –

+0

Посмотрите в ответ там и увидите, что если вы используете GetActiveObject (...), и есть два экземпляра Visual Studio, вы не знаете, вернет ли правильный экземпляр, поэтому рекомендуется создать новый экземпляр Visual Studio с помощью System.Activator.CreateInstance(). – user3114639