Beispiel #1
0
        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);
        }
Beispiel #2
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);
        }