public static DTE? TryLocateDteForProcess()

in src/Microsoft.VisualStudio.Extensibility.Testing.Xunit.Shared/Harness/IntegrationHelper.cs [43:87]


        public static DTE? TryLocateDteForProcess(Process process)
        {
            object? dte = null;
            var monikers = new IMoniker?[1];

            PInvoke.GetRunningObjectTable(0, out var runningObjectTable);
            runningObjectTable.EnumRunning(out var enumMoniker);
            PInvoke.CreateBindCtx(0, out var bindContext);

            do
            {
                monikers[0] = null;

                uint monikersFetched;
                unsafe
                {
                    enumMoniker.Next(1, monikers, &monikersFetched);
                }

                if (monikersFetched == 0)
                {
                    // There's nothing further to enumerate, so fail
                    return null;
                }

                var moniker = monikers[0]!;
                moniker.GetDisplayName(bindContext, null, out var fullDisplayName);

                // FullDisplayName will look something like: <ProgID>:<ProccessId>
                var displayNameParts = fullDisplayName.ToString().Split(':');
                if (!int.TryParse(displayNameParts.Last(), out var displayNameProcessId))
                {
                    continue;
                }

                if (displayNameParts[0].StartsWith("!VisualStudio.DTE", StringComparison.OrdinalIgnoreCase) &&
                    displayNameProcessId == process.Id)
                {
                    runningObjectTable.GetObject(moniker, out dte);
                }
            }
            while (dte == null);

            return (DTE)dte;
        }