Beispiel #1
0
        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));
            }
        }