如何通过编程在已运行的Visual Studio中打开项目/解决方案?

4

“可能的重复”旨在像记事本一样打开文件。我要求打开.csproj/.sln文件不仅仅是作为纯文本文件,而是作为完整的项目/解决方案。例如,如果我的路径是.sln文件,则应该打开整个解决方案,而不仅仅是单个的.sln文件。

我是这样打开项目/解决方案的:

var psi = new System.Diagnostics.ProcessStartInfo(path);
System.Diagnostics.Process.Start(psi);

在这里,path是项目/解决方案的路径。它可以正常运行,但会启动另一个Visual Studio来打开给定的文件。

我希望能够在已经运行的VS中打开项目/解决方案(如果没有,则在这种情况下也会启动VS)。

如何实现呢?


1
可能是在Visual Studio中以编程方式打开文件的重复问题。 - Tamás Szabó
1
@TamásSzabó,谢谢你,但我想打开 solution(就像在VS中手动打开一样),而不是将解决方案单个文件作为文本文件打开。链接的问题仅将VS用作文本编辑器,因此很有用,但这不是我的目标。 - astrowalker
1
没错。我开始研究用/command替换/edit,并将OpenSolution作为命令传递,但它也会打开一个新的VS。我现在得走了,但也许你可以在那里找到一些东西。祝好运! - Tamás Szabó
1个回答

2
我在这里为需要2019年仍在寻找此问题答案的任何人添加内容。
“如何以编程方式在已运行的Visual Studio中打开项目/解决方案?” 我还添加了如何打开文件夹或文件,以便完整性。
请确保将包含这些语句的代码用try/catch括起来,以处理路径未找到等情况。
假设:
  using EnvDTE;
  using EnvDTE80;
  using Microsoft.VisualStudio.Shell;

  var dte = Package.GetGlobalService(typeof(_DTE)) as DTE2;
  1. 编写代码以打开一个解决方案
   dte.Solution.Open(path);

要通过程序打开一个项目:
  dte.ExecuteCommand("File.OpenProject", path);
  1. 编写程序来打开一个文件夹
  dte.ExecuteCommand("File.OpenFolder", path);

要编程打开一个文件,可以按照以下步骤进行操作:
  dte.ExecuteCommand("File.OpenFile", path);

我希望这能对某些人有所帮助。

应该使用AsyncPackage.GetGlobalService。同时,请确保在包的构造函数中不要尝试获取DTE的值。 - Yann Duran
@sidso 你是指要打开另一个文件吗? - Yann Duran
你能在标准的控制台应用程序(.NET 6)中使用EnvDTE吗?还是仅限于VSIX项目? - Carlos Torrecillas
@CarlosTorrecillas 我可能错了,但据我所知,它没有使用任何需要从VS内部调用的VS特定服务。您应该能够通过将其作为Nuget包添加并调用它来使用它,但如果是我的话,我认为我会使用.NET文件处理方法而不是使用DTE。这真的取决于您想要实现什么。 - Yann Duran
@CarlosTorrecillas 是的,我认为你是对的。当然,DTE仅适用于VSIX项目。它的目的是操作或从Visual Studio部分获取数据。如果您要使用旧式自动化方法获取运行的Visual Studio实例的引用,可能会有一个DTE属性(或类似的内容)。像GetGlobalService这样的方法也应该能够调用。对于从另一个应用程序自动化VS的更精确的记忆已经太久了。希望对你有所帮助。 - Yann Duran
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接