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