C# 从单独的进程自动化VisualStudio实例

C# 从单独的进程自动化VisualStudio实例,c#,visual-studio,automation,C#,Visual Studio,Automation,有没有一种方法可以编写一个可以连接到正在运行的VisualStudio实例并向其发出命令的应用程序?例如,我是否可以编写一个带有按钮的WPF应用程序,当单击该按钮时,会向已打开的Visual Studio实例发出“Build.BuildSolution”命令,从而使其启动生成 我确信我可以使用SendKeys发送Ctrl+Shift+B,但我想知道是否有办法写入实际的API以自动化Visual Studio,并按名称调用命令。如果您只是尝试自动生成/打包应用程序,您应该研究一下--它是Micro

有没有一种方法可以编写一个可以连接到正在运行的VisualStudio实例并向其发出命令的应用程序?例如,我是否可以编写一个带有按钮的WPF应用程序,当单击该按钮时,会向已打开的Visual Studio实例发出“Build.BuildSolution”命令,从而使其启动生成


我确信我可以使用SendKeys发送Ctrl+Shift+B,但我想知道是否有办法写入实际的API以自动化Visual Studio,并按名称调用命令。

如果您只是尝试自动生成/打包应用程序,您应该研究一下--它是Microsoft的构建引擎,允许您编写Visual Studio大多数功能的自动化脚本。

下面是一个连接到运行中的Visual Studio并发出构建命令的C程序。
DTE.9
部分表示“Visual Studio 2008”-对于VS 2005使用
DTE.8
,对于VS 2010使用
DTE.10

using System;
using System.Runtime.InteropServices;
using EnvDTE80;

namespace SORemoteBuild
{
    class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            // Get an instance of the currently running Visual Studio IDE.
            EnvDTE80.DTE2 dte2;
            dte2 = (EnvDTE80.DTE2)System.Runtime.InteropServices.Marshal.
                                      GetActiveObject("VisualStudio.DTE.9.0");
            dte2.Solution.SolutionBuild.Build(true);
        }
    }

    public class MessageFilter : IOleMessageFilter
    {
        // ... Continues at http://msdn.microsoft.com/en-us/library/ms228772.aspx

(STAThread和MessageFilter的荒谬之处在于“由于外部多线程应用程序和Visual Studio之间的线程争用问题”,不管这意味着什么。从中粘贴代码可以使其正常工作。)

为什么不制作一个Visual Studio外接程序?如果我甚至可以在命名管道上监听这些命令。如果这是唯一的方法,我可能会制作一个VS加载项,但如果已经有一种从外部自动执行VS的方法,我会觉得很愚蠢,因为我会付出那么多的痛苦,重新启动VS那么多次。是的,但是(a)我想让VisualStudio知道它已被重建,以便后续运行将立即开始,(b)Build只是一个示例——它不是我想发出的唯一命令。我最终还想从VS中查询一些东西,比如编辑器保存状态等等。但像“按名称发出命令”这样的简单问题似乎是最好的开始。