using Microsoft.VisualStudio.Extensibility; using Microsoft.VisualStudio.Extensibility.DebuggerVisualizers; using Microsoft.VisualStudio.RpcContracts.RemoteUI; using NamedPipes; using NrxVisualizerObjectSource; using System; using System.Numerics; using System.Threading; using System.Threading.Tasks; namespace NrxDebugVisualizer; [VisualStudioContribution] internal sealed class NrxDebuggerVisualizerProvider : DebuggerVisualizerProvider { public override DebuggerVisualizerProviderConfiguration DebuggerVisualizerProviderConfiguration => new( [ new VisualizerTargetType("%Vector3Visualizer_DisplayName%", @"System.Numerics.Vector3, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e"), new VisualizerTargetType("%QuaternionVisualizer_DisplayName%", typeof(Quaternion)), new VisualizerTargetType("%FrameVisualizer_DisplayName%", @"Num.Roto.Visualization.Math.Geometry.Frame, Num.Roto.Visualization.Math, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"), new VisualizerTargetType("%NrxIEnumerableVisualizer_DisplayName%", @"System.Collections.Generic.IEnumerable`1, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"), ]) { VisualizerObjectSourceType = new VisualizerObjectSourceType(typeof(NrxVisualizerObjectSource.NrxVisualizerObjectSource)), Style = VisualizerStyle.ToolWindow, }; public override async Task CreateVisualizerAsync(VisualizerTarget visualizerTarget, CancellationToken cancellationToken) { Vector3Model? model = await visualizerTarget.ObjectSource.RequestDataAsync(jsonSerializer: null, cancellationToken); SendToVisualizer(model); //throw new InvalidOperationException("This is a test exception to demonstrate the visualizer. Please remove this line and implement the visualizer logic."); var control = new Vector3VisualizerUserControl(dataContext: model); return await Task.FromResult(control); } private static NamedPipeClient? PipeClient { get; set; } private static void SendToVisualizer(Vector3Model? vector3Model) { if (vector3Model is null) return; PipeClient ??= new NamedPipeClient("testPipe", serverName: @"TestServer", logger: (m) => Console.WriteLine(m)); _ = PipeClient.SetMessageAsync($"Hello from {nameof(CreateVisualizerAsync)},vector3Model = {vector3Model.Vector3},{vector3Model.Quaternion}"); } }