void Init(IMessageTypeResolver clientResolver = null, IMessageTypeResolver serverResolver = null)
        {
            _originalContext = SynchronizationContext.Current;
            SynchronizationContext.SetSynchronizationContext(new DisabledSyncContext());
            var clientTransport = new BsonTcpTransport(clientResolver ?? new DefaultMessageTypeResolver());
            var serverTransport = new BsonTcpTransport(serverResolver ?? new DefaultMessageTypeResolver());

            var tcpListener = new TcpListener(IPAddress.Loopback, 0);

            tcpListener.Start();
            var port = ((IPEndPoint)tcpListener.LocalEndpoint).Port;

            tcpListener.Stop();

            var tcs = new TaskCompletionSource <int>();

            serverTransport.Listen(IPAddress.Loopback, port, connected =>
            {
                _server = connected;
                tcs.SetResult(0);
            });
            _client = clientTransport.Connect(IPAddress.Loopback, port).Result;
            _disposables.Add(_client);
            _client.OnMessage += (_, m) => _clientMessages.Add(m);
            tcs.Task.Wait();
            _disposables.Add(_server);
            _server.OnMessage += (_, m) => _serverMessages.Add(m);
        }
Пример #2
0
        static void Main(string[] args)
        {
            AppBuilder.Configure <App>().UsePlatformDetect().SetupWithoutStarting();

            var l = new TcpListener(IPAddress.Loopback, 0);

            l.Start();
            var port = ((IPEndPoint)l.LocalEndpoint).Port;

            l.Stop();

            var transport = new BsonTcpTransport();

            transport.Listen(IPAddress.Loopback, port, sc =>
            {
                Dispatcher.UIThread.Post(() =>
                {
                    new RemoteServer(sc).Content = new MainView();
                });
            });

            var cts = new CancellationTokenSource();

            transport.Connect(IPAddress.Loopback, port).ContinueWith(t =>
            {
                Dispatcher.UIThread.Post(() =>
                {
                    var window = new Window()
                    {
                        Content = new RemoteWidget(t.Result)
                    };
                    window.Closed += delegate { cts.Cancel(); };
                    window.Show();
                });
            });
            Dispatcher.UIThread.MainLoop(cts.Token);
        }
Пример #3
0
        public async Task Designer_In_Win32_Mode_Should_Provide_Valid_Hwnd(
            string outputDir,
            string executableName,
            string assemblyName,
            string xamlFile)
        {
            Skip.IfNot(RuntimeInformation.IsOSPlatform(OSPlatform.Windows));

            var    xaml = File.ReadAllText(xamlFile);
            string buildType;

#if DEBUG
            buildType = "Debug";
#else
            buildType = "Release";
#endif
            outputDir = outputDir.Replace("$BUILD", buildType);

            var  sessionId = Guid.NewGuid();
            long handle    = 0;

            var resultMessageReceivedToken = new CancellationTokenSource();

            var tcpListener = new TcpListener(IPAddress.Loopback, 0);
            tcpListener.Start();
            var port = ((IPEndPoint)tcpListener.LocalEndpoint).Port;
            tcpListener.Stop();
            var transport = new BsonTcpTransport();
            transport.Listen(IPAddress.Loopback, port, conn =>
            {
                conn.OnMessage += async(_, msg) =>
                {
                    if (msg is StartDesignerSessionMessage start)
                    {
                        Assert.Equal(sessionId, Guid.Parse(start.SessionId));
                        await conn.Send(new UpdateXamlMessage
                        {
                            AssemblyPath = Path.Combine(outputDir, assemblyName),
                            Xaml         = xaml
                        });
                    }
                    else if (msg is UpdateXamlResultMessage result)
                    {
                        if (result.Error != null)
                        {
                            outputHelper.WriteLine(result.Error);
                        }
                        handle = result.Handle != null ? long.Parse(result.Handle) : 0;
                        resultMessageReceivedToken.Cancel();
                        conn.Dispose();
                    }
                };
            });

            var cmdline =
                $"exec --runtimeconfig \"{outputDir}{executableName}.runtimeconfig.json\" --depsfile \"{outputDir}{executableName}.deps.json\" "
                + $" \"{DesignerAppPath.Replace("$BUILD", buildType)}\" "
                + $"--transport tcp-bson://127.0.0.1:{port}/ --session-id {sessionId} --method win32 \"{outputDir}{executableName}.dll\"";

            using (var proc = new Process
            {
                StartInfo = new ProcessStartInfo("dotnet", cmdline)
                {
                    UseShellExecute = false,
                    RedirectStandardOutput = true,
                    RedirectStandardError = true,
                    CreateNoWindow = true,
                    WorkingDirectory = outputDir,
                },
                EnableRaisingEvents = true
            })
            {
                proc.Start();

                var cancelled = false;
                try
                {
                    await Task.Delay(10000, resultMessageReceivedToken.Token);
                }
                catch (TaskCanceledException)
                {
                    cancelled = true;
                }

                try
                {
                    proc.Kill();
                }
                catch
                {
                    //
                }

                proc.WaitForExit();
                Assert.True(cancelled,
                            $"Message Not Received.\n" + proc.StandardOutput.ReadToEnd() + "\n" +
                            proc.StandardError.ReadToEnd());
                Assert.NotEqual(0, handle);
            }
        }