public VisualStudioInstance(Process process, DTE dte) { _hostProcess = process; _dte = dte; dte.ExecuteCommandAsync(VisualStudioCommandNames.VsStartServiceCommand).GetAwaiter().GetResult(); _integrationServiceChannel = new IpcClientChannel($"IPC channel client for {_hostProcess.Id}", sinkProvider: null); ChannelServices.RegisterChannel(_integrationServiceChannel, ensureSecurity: true); // Connect to a 'well defined, shouldn't conflict' IPC channel var serviceUri = string.Format($"ipc://{IntegrationService.PortNameFormatString}", _hostProcess.Id); _integrationService = (IntegrationService)(Activator.GetObject(typeof(IntegrationService), $"{serviceUri}/{typeof(IntegrationService).FullName}")); _integrationService.Uri = serviceUri; // 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. _integrationService.Execute(typeof(RemotingHelper), nameof(RemotingHelper.WaitForSystemIdle)); _csharpInteractiveWindow = new Lazy <CSharpInteractiveWindow>(() => new CSharpInteractiveWindow(this)); _editorWindow = new Lazy <EditorWindow>(() => new EditorWindow(this)); _solutionExplorer = new Lazy <SolutionExplorer>(() => new SolutionExplorer(this)); _workspace = new Lazy <Workspace>(() => new Workspace(this)); // Ensure we are in a known 'good' state by cleaning up anything changed by the previous instance Cleanup(); }
public VisualStudioInstance(Process process, DTE dte) { _hostProcess = process; _dte = dte; dte.ExecuteCommandAsync(VisualStudioCommandNames.VsStartServiceCommand).GetAwaiter().GetResult(); _integrationServiceChannel = new IpcClientChannel($"IPC channel client for {_hostProcess.Id}", sinkProvider: null); ChannelServices.RegisterChannel(_integrationServiceChannel, ensureSecurity: true); // Connect to a 'well defined, shouldn't conflict' IPC channel var serviceUri = string.Format($"ipc://{IntegrationService.PortNameFormatString}", _hostProcess.Id); _integrationService = (IntegrationService)(Activator.GetObject(typeof(IntegrationService), $"{serviceUri}/{typeof(IntegrationService).FullName}")); _integrationService.Uri = serviceUri; // 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. _integrationService.Execute(typeof(RemotingHelper), nameof(RemotingHelper.WaitForSystemIdle)); _csharpInteractiveWindow = new Lazy<CSharpInteractiveWindow>(() => new CSharpInteractiveWindow(this)); _editorWindow = new Lazy<EditorWindow>(() => new EditorWindow(this)); _solutionExplorer = new Lazy<SolutionExplorer>(() => new SolutionExplorer(this)); _workspace = new Lazy<Workspace>(() => new Workspace(this)); // Ensure we are in a known 'good' state by cleaning up anything changed by the previous instance Cleanup(); }
private void CloseRemotingService() { try { if ((IntegrationHelper.RetryRpcCall(() => _dte?.Commands.Item(VisualStudioCommandNames.VsStopServiceCommand).IsAvailable).GetValueOrDefault())) { _dte.ExecuteCommandAsync(VisualStudioCommandNames.VsStopServiceCommand).GetAwaiter().GetResult(); } } finally { if (_integrationServiceChannel != null) { ChannelServices.UnregisterChannel(_integrationServiceChannel); } } }