private static List <DteInstanceInfo> RetrieveDteInstances() { var candidates = new List <DteInstanceInfo>(); var retVal = WinAPI.GetRunningObjectTable(0, out IRunningObjectTable rot); if (retVal != 0) { return(candidates); } rot.EnumRunning(out IEnumMoniker enumMoniker); var monikers = new IMoniker[1]; while (enumMoniker.Next(1, monikers, IntPtr.Zero) == 0) { WinAPI.CreateBindCtx(0, out var bindCtx); monikers[0].GetDisplayName(bindCtx, null, out var displayName); if (!DteProgIds.Any(progId => displayName.StartsWith($"!{progId}:"))) { continue; } try { rot.GetObject(monikers[0], out dynamic dte); var instanceInfo = new DteInstanceInfo { DisplayName = displayName, DteInstance = dte }; candidates.Add(instanceInfo); } catch (COMException) { // DTE might not be ready at this time } } return(candidates); }