in src/Microsoft.VisualStudio.Extensibility.Testing.Xunit.Shared/Harness/VisualStudioInstance.cs [30:78]
public VisualStudioInstance(Process hostProcess, DTE dte, Version version, ImmutableHashSet<string> supportedPackageIds, string installationPath)
{
HostProcess = hostProcess;
Dte = dte;
Version = version;
SupportedPackageIds = supportedPackageIds;
InstallationPath = installationPath;
if (Debugger.IsAttached)
{
// If a Visual Studio debugger is attached to the test process, attach it to the instance running
// integration tests as well.
var debuggerHostDte = GetDebuggerHostDte();
int targetProcessId = Process.GetCurrentProcess().Id;
var localProcess = debuggerHostDte?.Debugger.LocalProcesses.OfType<EnvDTE80.Process2>().FirstOrDefault(p => p.ProcessID == hostProcess.Id);
localProcess?.Attach2("Managed");
}
StartRemoteIntegrationService(dte);
string portName = $"IPC channel client for {HostProcess.Id}";
_integrationServiceChannel = new IpcChannel(
new Hashtable
{
{ "name", portName },
{ "portName", portName },
},
new BinaryClientFormatterSinkProvider(),
new BinaryServerFormatterSinkProvider { TypeFilterLevel = TypeFilterLevel.Full });
ChannelServices.RegisterChannel(_integrationServiceChannel, ensureSecurity: false);
// Connect to a 'well defined, shouldn't conflict' IPC channel
_integrationService = IntegrationService.GetInstanceFromHostProcess(hostProcess);
// Create marshal-by-ref object that runs in host-process.
_inProc = ExecuteInHostProcess<VisualStudio_InProc>(
type: typeof(VisualStudio_InProc),
methodName: nameof(VisualStudio_InProc.Create));
// There is a lot of VS initialization code that goes on, so we want to wait for that to 'settle' before
// we start executing any actual code.
_inProc.WaitForSystemIdle();
TestInvoker = new TestInvoker_OutOfProc(this);
// Ensure we are in a known 'good' state by cleaning up anything changed by the previous instance
CleanUp();
}