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); }
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); }
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); } }