检查项目是否已由Visual Studio

时间:2015-12-28 16:10:44

标签: java windows visual-studio file-in-use

我需要从java app打开一个Visual Studio解决方案,我想确保在打开它之前这个VS项目尚未打开。

我想到了两个解决方案:

一,检查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项目,但我不知道。

修改 我刚刚发现Visual Studio在打开时没有锁定解决方案文件,所以我的第一个解决方案不适用。正如您在下面的评论中看到的那样,第二个不是一个选项,因为在VS中打开或关闭的项目将无法正确显示。所以我需要一种不同的方式。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

不是万无一失,但您可以枚举顶部窗口标题并检查“SolutionName - Microsoft Visual Studio”。

答案 1 :(得分:0)

Visual Studio提供了一个COM接口,可用于获取正在运行的Visual Studio实例并检查dte.Solution.FullName属性。请参阅示例Getting EnvDTE.DTE instance outside Visual Studio IDE