using Microsoft.VisualStudio.Extensibility; using Microsoft.VisualStudio.Extensibility.DebuggerVisualizers; using Microsoft.VisualStudio.RpcContracts.RemoteUI; using NamedPipes; 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) { VisualizerModel? model = await visualizerTarget.ObjectSource.RequestDataAsync(jsonSerializer: null, cancellationToken); await SendToVisualizerAsync(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 async Task SendToVisualizerAsync(VisualizerModel? visualizerModel) { if (visualizerModel is null) return; PipeClient ??= new NamedPipeClient("testPipe", serverName: @"TestServer", logger: (m) => Console.WriteLine(m)); await PipeClient.SetVisualizerModelAsync(visualizerModel); await PipeClient.SetMessageAsync($"Hello from {nameof(CreateVisualizerAsync)},visualizerModel.Content = {visualizerModel.Content}"); } }