public static IEnumerable <KeyValuePair <Process, EnvDTE._DTE> > GetVSInstances() { IRunningObjectTable runningObjectTable = WinApiHelper.GetRunningObjectTable(); IEnumMoniker enumMoniker; runningObjectTable.EnumRunning(out enumMoniker); IMoniker[] monikers = new IMoniker[1]; for (enumMoniker.Reset(); enumMoniker.Next(1, monikers, IntPtr.Zero) == 0;) { EnvDTE._DTE dte; Process dteProcess; try { IBindCtx ctx = WinApiHelper.NewBindCtx(); string runningObjectName; monikers[0].GetDisplayName(ctx, null, out runningObjectName); if (!runningObjectName.StartsWith("!VisualStudio") && !runningObjectName.StartsWith("!WDExpress.DTE")) { continue; } object runningObjectVal; runningObjectTable.GetObject(monikers[0], out runningObjectVal); dte = runningObjectVal as EnvDTE._DTE; if (dte == null) { continue; } int dteProcessId = int.Parse(runningObjectName.Split(':')[1]); dteProcess = Process.GetProcessById(dteProcessId); } catch { continue; } yield return(new KeyValuePair <Process, EnvDTE._DTE>(dteProcess, dte)); } }