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