Ottieni l’attuale istanza di Visual Studio (EnvDTE) in C #

Come posso ottenere l’istanza corrente (EnvDTE) di Visual Studio in C #?

se si dispone di più processi di Visual Studio con la seguente riga di codice ottengo l’object EnvDTE80.DTE2 :

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

A questo punto, come posso ottenere la soluzione corrente?

Usa la tabella degli oggetti in esecuzione per ottenere tutte le istanze, quindi seleziona quella desiderata.

Non penso che tu possa fare di meglio. È simile al modo in cui si collega un debugger a un’istanza VS. Devi selezionarne uno da una lista.

 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);