in src/Microsoft.VisualStudio.Extensibility.Testing.Xunit.Shared/Harness/VisualStudioInstanceFactory.cs [124:177]
private async Task UpdateCurrentlyRunningInstanceAsync(Version version, string? rootSuffix, ImmutableList<string> extensionFiles, ImmutableHashSet<string> requiredPackageIds, bool shouldStartNewInstance)
{
Process hostProcess;
DTE dte;
Version actualVersion;
ImmutableHashSet<string> supportedPackageIds;
string installationPath;
if (shouldStartNewInstance)
{
// We are starting a new instance, so ensure we close the currently running instance, if it exists
_currentlyRunningInstance?.Close();
var instance = LocateVisualStudioInstance(version, requiredPackageIds);
supportedPackageIds = instance.Item3;
installationPath = instance.Item1;
actualVersion = instance.Item2;
hostProcess = await StartNewVisualStudioProcessAsync(installationPath, version, rootSuffix, extensionFiles).ConfigureAwait(true);
// We wait until the DTE instance is up before we're good
dte = await IntegrationHelper.WaitForNotNullAsync(() => IntegrationHelper.TryLocateDteForProcess(hostProcess)).ConfigureAwait(true);
}
else
{
// We are going to reuse the currently running instance, so ensure that we grab the host Process and Dte
// before cleaning up any hooks or remoting services created by the previous instance. We will then
// create a new VisualStudioInstance from the previous to ensure that everything is in a 'clean' state.
//
// We create a new DTE instance in the current context since the COM object could have been separated
// from its RCW during the previous test.
Debug.Assert(_currentlyRunningInstance != null, "Assertion failed: _currentlyRunningInstance != null");
hostProcess = _currentlyRunningInstance!.HostProcess;
dte = await IntegrationHelper.WaitForNotNullAsync(() => IntegrationHelper.TryLocateDteForProcess(hostProcess)).ConfigureAwait(true);
actualVersion = _currentlyRunningInstance.Version;
supportedPackageIds = _currentlyRunningInstance.SupportedPackageIds;
installationPath = _currentlyRunningInstance.InstallationPath;
_currentlyRunningInstance.Close(exitHostProcess: false);
}
_currentlyRunningInstance = new VisualStudioInstance(hostProcess, dte, actualVersion, supportedPackageIds, installationPath);
if (shouldStartNewInstance)
{
var harnessAssemblyDirectory = Path.GetDirectoryName(typeof(VisualStudioInstanceFactory).Assembly.CodeBase);
if (harnessAssemblyDirectory.StartsWith("file:"))
{
harnessAssemblyDirectory = new Uri(harnessAssemblyDirectory).LocalPath;
}
_currentlyRunningInstance.AddCodeBaseDirectory(harnessAssemblyDirectory);
}
}