在C#中获取当前的visual studio实例(EnvDTE)

如何在C#中获取visual studio的当前实例(EnvDTE)?

如果你有多个进程visual studio与下面的代码行我得到对象EnvDTE80.DTE2

 EnvDTE80.DTE2 dte2 = (EnvDTE80.DTE2)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.11.0"); 

在这一点上,我如何获得当前的解决方案?

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

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

 IEnumerable 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) { var dte = rot.GetObject(moniker) 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);