我需要从 java 应用程序打开一个 Visual Studio 解决方案,并且我想在打开它之前确保这个 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 中打开或关闭的项目将无法正确显示。所以我需要一种不同的方式。
任何想法?