private bool TryFindDTE(string slnPath, out EnvDTE.DTE dte)
        {
            if (dteInstances.TryGetValue(slnPath, out dte))
            {
                return(true);
            }

            try
            {
                AccessVisualStudioResult accessResult = AccessVisualStudioViaDTE(slnPath, out dte);
                if (accessResult == AccessVisualStudioResult.VSInstanceIsOpen)
                {
                    dteInstances[slnPath] = dte;
                    return(true);
                }
            }
            catch (Exception e)
            {
                Log(ELogVerbosity.Warning, e.ToString());
            }

            return(false);
        }
        private AccessVisualStudioResult AccessVisualStudioViaDTE(string solutionPath, out EnvDTE.DTE dte)
        {
            dte = null;
            AccessVisualStudioResult accessResult = AccessVisualStudioResult.VSInstanceIsNotOpen;

            // Open the Running Object Table (ROT)
            IRunningObjectTable runningObjectTable;

            if (GetRunningObjectTable(0, out runningObjectTable) == 0)
            {
                IEnumMoniker monikersTable;
                runningObjectTable.EnumRunning(out monikersTable);
                if (monikersTable != null)
                {
                    monikersTable.Reset();

                    // Look for all visual studio instances in the ROT
                    IMoniker[] currentMoniker = new IMoniker[1];
                    while (accessResult != AccessVisualStudioResult.VSInstanceIsOpen && monikersTable.Next(1, currentMoniker, IntPtr.Zero) == 0)
                    {
                        IBindCtx bindCtx;
                        string   displayName = null;
                        if (CreateBindCtx(0, out bindCtx) == 0)
                        {
                            currentMoniker[0].GetDisplayName(bindCtx, null, out displayName);
                        }
                        if (displayName != null)
                        {
                            if (IsVisualStudioDTEMoniker(displayName))
                            {
                                object comObject;
                                if (runningObjectTable.GetObject(currentMoniker[0], out comObject) == 0)
                                {
                                    EnvDTE.DTE tempDte = comObject as EnvDTE.DTE;

                                    // Get the solution path for this instance
                                    // If it equals the solution we would have opened above in RunVisualStudio(), we'll take that
                                    EnvDTE.Solution solution = tempDte.Solution;
                                    string          filename = solution.FileName;
                                    if (solution.IsOpen)
                                    {
                                        if (!string.IsNullOrWhiteSpace(filename))
                                        {
                                            if (string.Equals(Path.GetFullPath(filename), Path.GetFullPath(solutionPath), StringComparison.OrdinalIgnoreCase))
                                            {
                                                dte          = tempDte;
                                                accessResult = AccessVisualStudioResult.VSInstanceIsOpen;
                                            }
                                        }
                                    }
                                    else
                                    {
                                        Log(ELogVerbosity.Warning, "Visual Studio is open but could not be queried - it may be blocked by a modal operation");
                                        accessResult = AccessVisualStudioResult.VSInstanceIsBlocked;
                                    }
                                }
                                else
                                {
                                    Log(ELogVerbosity.Warning, "Couldn't get Visual Studio COM object");
                                    accessResult = AccessVisualStudioResult.VSInstanceUnknown;
                                }
                            }
                        }
                        else
                        {
                            Log(ELogVerbosity.Warning, "Couldn't get display name");
                            accessResult = AccessVisualStudioResult.VSInstanceUnknown;
                        }
                    }
                }
                else
                {
                    Log(ELogVerbosity.Warning, "Couldn't enumerate ROT table");
                    accessResult = AccessVisualStudioResult.VSInstanceUnknown;
                }
            }
            else
            {
                Log(ELogVerbosity.Warning, "Couldn't get ROT table");
                accessResult = AccessVisualStudioResult.VSInstanceUnknown;
            }

            return(accessResult);
        }