using System; using System.Diagnostics; using System.IO; using System.Threading.Tasks; using PipeMethodCalls; namespace NamedPipes; public class NamedPipeClient (string pipeName,string? serverLocation = null, string? serverName = null,Action? logger = null): IDebugVisualizer, IDisposable { private bool IsConnected => PipeClient.State == PipeState.Connected; private PipeClient PipeClient { get; } = new(new PipeSerializer(), pipeName); private string ServerLocation { get; } = serverLocation ?? Environment.GetEnvironmentVariable("USERPROFILE") + @"\Documents\Visual Studio 2026\Visualizers\Server\NrxVisualizer\"; private string ServerName { get; } = serverName ?? "Num.Roto.Nrx.VisualizerServer"; private Action Logger { get;} = logger ??((m) => Trace.WriteLine(m)); private async Task StartServerAsync() { if (IsConnected) return; PipeClient.SetLogger((m) => Trace.WriteLine(m)); var serverAvailable = Process.GetProcessesByName(ServerName).Length > 0; Logger($"Server available: {serverAvailable}"); if (!serverAvailable) { var serverPath = ServerLocation + ServerName + ".exe"; if (!File.Exists(serverPath)) throw new FileNotFoundException($"{nameof(StartServerAsync)}, Server does not exist, Path = {serverPath}"); var server = new Process { StartInfo = { FileName = serverPath } }; server.Start(); } try { await PipeClient.ConnectAsync().ConfigureAwait(true); Logger("NamedPipeClient.StartServerAsync succeded."); return; } catch(Exception e) { Logger(e.ToString()); throw; } } public async Task SetDebugObjectAsync(DebugObject debugObject) { await StartServerAsync().ConfigureAwait(true); var result = await PipeClient.InvokeAsync(server => server.SetDebugObjectAsync(debugObject)); Logger("NamedPipeClient.SetDebugObjectAsync: result = " + result); return result; } public async Task SetMessageAsync(string message) { await StartServerAsync().ConfigureAwait(true); var result = await PipeClient.InvokeAsync(server => server.SetMessageAsync(message)); Logger("NamedPipeClient.SetMessageAsync: result = " + result); return result; } public void Dispose() { GC.SuppressFinalize(this); PipeClient.Dispose(); } }