public static void RunServer(string serverPort, string semaphoreName) { // Disables Windows Error Reporting for the process, so that the process fails fast. if (Environment.OSVersion.Version >= new Version(6, 1, 0, 0)) { SetErrorMode(GetErrorMode() | ErrorMode.SEM_FAILCRITICALERRORS | ErrorMode.SEM_NOOPENFILEERRORBOX | ErrorMode.SEM_NOGPFAULTERRORBOX); } ServiceHost serviceHost = null; try { using (var semaphore = Semaphore.OpenExisting(semaphoreName)) { serviceHost = new ServiceHost(typeof(Service)); serviceHost.AddServiceEndpoint(typeof(IService), CreateBinding(), GetAddress(serverPort)); serviceHost.Open(); _outWriter = CreateConsoleWriter(); Console.SetOut(_outWriter); _errorWriter = CreateConsoleWriter(); Console.SetError(_errorWriter); Debug.Listeners.Clear(); Debug.Listeners.Add(new ConsoleTraceListener()); Debug.AutoFlush = true; using (var resetEvent = new ManualResetEventSlim(false)) { var uiThread = new Thread(() => { _serverDispatcher = Dispatcher.CurrentDispatcher; // ReSharper disable once AccessToDisposedClosure resetEvent.Set(); Dispatcher.Run(); }); uiThread.SetApartmentState(ApartmentState.STA); uiThread.IsBackground = true; uiThread.Start(); resetEvent.Wait(); } semaphore.Release(); } Thread.Sleep(Timeout.Infinite); // TODO } finally { if (serviceHost?.State == CommunicationState.Opened) { serviceHost.Close(); } } // force exit even if there are foreground threads running: Environment.Exit(0); }
public static void RunServer(string serverPort, string semaphoreName, int clientProcessId) { if (!AttachToClientProcess(clientProcessId)) { return; } DisableWer(); ServerImpl server = null; try { var executionThread = CreateExecutionThread(); server = new ServerImpl(serverPort, executionThread.syncContext); server.Start(); _outWriter = CreateConsoleWriter(); Console.SetOut(_outWriter); _errorWriter = CreateConsoleWriter(); Console.SetError(_errorWriter); // TODO: fix debug capturing //Debug.Listeners.Clear(); //Debug.Listeners.Add(new ConsoleTraceListener()); //Debug.AutoFlush = true; _clientExited.Wait(); executionThread.complete(); } finally { server?.Dispose(); } // force exit even if there are foreground threads running Exit?.Invoke(0); }