如何让DTE运行Visual Studio实例?

Dav*_*ier 10 c# visual-studio

如何获取Visual Studio的所有运行实例以便我可以自动执行?

(因为添加了这个问题,这一个被关闭)

Dav*_*ier 14

使用运行对象表获取所有实例,然后选择所需的实例.

我认为你不能比这更好.它类似于将调试器附加到VS实例的方式.您必须从列表中选择一个.

IEnumerable<DTE> GetInstances()
{
    IRunningObjectTable rot;
    IEnumMoniker enumMoniker;
    int retVal = GetRunningObjectTable(0, out rot);

    if (retVal == 0)
    {
        rot.EnumRunning(out enumMoniker);

        IntPtr fetched = IntPtr.Zero;
        IMoniker[] moniker = new IMoniker[1];
        while (enumMoniker.Next(1, moniker, fetched) == 0)
        {
            IBindCtx bindCtx;
            CreateBindCtx(0, out bindCtx);
            string displayName;
            moniker[0].GetDisplayName(bindCtx, null, out displayName);
            Console.WriteLine("Display Name: {0}", displayName);
            bool isVisualStudio = displayName.StartsWith("!VisualStudio");
            if (isVisualStudio)
            {
               object obj;
               rot.GetObject(moniker[0], out obj);
               var dte = obj as DTE;
               yield return dte;
            }
        }
    }
}

[DllImport("ole32.dll")]
private static extern void CreateBindCtx(int reserved, out IBindCtx ppbc);

[DllImport("ole32.dll")]
private static extern int GetRunningObjectTable(int reserved, out IRunningObjectTable prot);
Run Code Online (Sandbox Code Playgroud)

  • 需要注意的是:如果调用脚本是从具有提升权限的进程调用的,则此函数不会返回未以管理员身份启动的Visual Studio实例的`DTE`对象. (3认同)