From 91cf7d4265af452e0dcbcae52cfe53732aff756d Mon Sep 17 00:00:00 2001 From: Matthias Heil Date: Tue, 20 Jan 2026 11:26:24 +0100 Subject: [PATCH] Example of using string instead of typeof --- .../Vector3Visualizer/MyRemoteUserControl.cs | 80 +++++++++++++++++++ .../Vector3DebuggerVisualizerProvider.cs | 28 +++---- .../Vector3VisualizerSource/Vector3Model.cs | 7 +- .../Vector3ObjectSource.cs | 14 +++- .../Vector3VisualizerTest/Program.cs | 8 +- 5 files changed, 117 insertions(+), 20 deletions(-) create mode 100644 Vector3Visualizer/Vector3Visualizer/MyRemoteUserControl.cs diff --git a/Vector3Visualizer/Vector3Visualizer/MyRemoteUserControl.cs b/Vector3Visualizer/Vector3Visualizer/MyRemoteUserControl.cs new file mode 100644 index 0000000..689347b --- /dev/null +++ b/Vector3Visualizer/Vector3Visualizer/MyRemoteUserControl.cs @@ -0,0 +1,80 @@ +using Microsoft.VisualStudio.RpcContracts.RemoteUI; +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Vector3VisualizerSource; +namespace Vector3Visualizer; + +public class MyRemoteUserControl : IRemoteWpfUserControl, IRemoteProxiedUserControl, IRemoteUserControl, IDisposable, IRemoteProxiedUserControl2 +{ + public Vector3Model? Model { get; } + + public MyRemoteUserControl(Vector3Model? model) => Model = model; + private bool disposedValue; + + + protected virtual void Dispose(bool disposing) + { + if (!disposedValue) + { + if (disposing) + { + // TODO: dispose managed state (managed objects) + } + + // TODO: free unmanaged resources (unmanaged objects) and override finalizer + // TODO: set large fields to null + disposedValue = true; + } + } + + // // TODO: override finalizer only if 'Dispose(bool disposing)' has code to free unmanaged resources + // ~MyRemoteUserControl() + // { + // // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method + // Dispose(disposing: false); + // } + + void IDisposable.Dispose() + { + // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method + Dispose(disposing: true); + GC.SuppressFinalize(this); + } + + Task IRemoteWpfUserControl.InitializeAsync(IRemoteProxiedUserControlClient remoteUserControlClient, CancellationToken cancellationToken) + { + return Task.FromResult(new RemoteWpfUserControlDefinition()); + } + + Task IRemoteWpfUserControl.ControlLoadedAsync(CancellationToken cancellationToken) + { + return Task.CompletedTask; + } + + Task IRemoteProxiedUserControl.GetObjectAsync(ObjectId id, CancellationToken cancellationToken) + { + return Task.FromResult(false); + } + + Task IRemoteProxiedUserControl.SetObjectPropertyAsync(ObjectId id, string propertyName, MessagePackFragment value, CancellationToken cancellationToken) + { + return Task.FromResult(false); + } + + Task IRemoteProxiedUserControl.SetCollectionEntryAsync(ObjectId id, int index, MessagePackFragment value, ObjectVersion? version, CancellationToken cancellationToken) + { + return Task.FromResult(false); + } + + Task IRemoteProxiedUserControl.InvokeAsync(ObjectId id, MessagePackFragment parameter, CancellationToken cancellationToken) + { + return Task.FromResult(false); + } + + Task IRemoteProxiedUserControl2.InvokeAsync(ObjectId id, MessagePackFragment parameter, IReadOnlyDictionary context, CancellationToken cancellationToken) + { + return Task.FromResult(false); + } +} \ No newline at end of file diff --git a/Vector3Visualizer/Vector3Visualizer/Vector3DebuggerVisualizerProvider.cs b/Vector3Visualizer/Vector3Visualizer/Vector3DebuggerVisualizerProvider.cs index a39a71e..fcbd97b 100644 --- a/Vector3Visualizer/Vector3Visualizer/Vector3DebuggerVisualizerProvider.cs +++ b/Vector3Visualizer/Vector3Visualizer/Vector3DebuggerVisualizerProvider.cs @@ -1,11 +1,11 @@ -using Vector3VisualizerSource; -using Microsoft.VisualStudio.Extensibility; +using Microsoft.VisualStudio.Extensibility; using Microsoft.VisualStudio.Extensibility.DebuggerVisualizers; using Microsoft.VisualStudio.RpcContracts.RemoteUI; - +using System.Collections.Generic; +using System.Numerics; using System.Threading; using System.Threading.Tasks; -using System.Numerics; +using Vector3VisualizerSource; namespace Vector3Visualizer; [VisualStudioContribution] @@ -14,20 +14,20 @@ internal class Vector3DebuggerVisualizerProvider : DebuggerVisualizerProvider [System.Diagnostics.CodeAnalysis.SuppressMessage("ConstantExpressionEvaluator", "CEE0027:String not localized", Justification = "")] public override DebuggerVisualizerProviderConfiguration DebuggerVisualizerProviderConfiguration => new( [ - new VisualizerTargetType("Vector3 Visualizer", typeof(Vector3)), - new VisualizerTargetType("QuaternionVisualizer", typeof(Quaternion)) - ]) + new VisualizerTargetType("Vector3 Visualizer", "System.Numerics.Vector3, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e"), + new VisualizerTargetType("Vector3[] Visualizer", typeof(Vector3[])), + new VisualizerTargetType("List Visualizer", typeof(List<>)), + new VisualizerTargetType("Quaternion Visualizer", typeof(Quaternion)) + ]) { VisualizerObjectSourceType = new VisualizerObjectSourceType(typeof(Vector3ObjectSource)), Style = VisualizerStyle.ToolWindow, }; - public override async Task CreateVisualizerAsync( - VisualizerTarget visualizerTarget, CancellationToken cancellationToken) + public override async Task CreateVisualizerAsync(VisualizerTarget visualizerTarget, CancellationToken cancellationToken) { - Vector3Model? model = await visualizerTarget.ObjectSource.RequestDataAsync(jsonSerializer: null, CancellationToken.None); - - return await Task.FromResult( - new Vector3VisualizerUserControl(model)); + Vector3Model? model = await visualizerTarget.ObjectSource.RequestDataAsync(jsonSerializer: null, CancellationToken.None); + return await Task.FromResult(new Vector3VisualizerUserControl(model)); + //return await Task.FromResult(new MyRemoteUserControl(model)); } -} \ No newline at end of file +} diff --git a/Vector3Visualizer/Vector3VisualizerSource/Vector3Model.cs b/Vector3Visualizer/Vector3VisualizerSource/Vector3Model.cs index f4d327f..8f70829 100644 --- a/Vector3Visualizer/Vector3VisualizerSource/Vector3Model.cs +++ b/Vector3Visualizer/Vector3VisualizerSource/Vector3Model.cs @@ -1,13 +1,12 @@ -using System.Numerics; -using System.Runtime.Serialization; +using System.Runtime.Serialization; namespace Vector3VisualizerSource; [DataContract] public class Vector3Model { [DataMember] - public string Vector3 { get; set; } = string.Empty; + public string Vector3 { get; set; } = "Null"; [DataMember] - public string Quaternion { get; set; } = string.Empty; + public string Quaternion { get; set; } = "Null"; } diff --git a/Vector3Visualizer/Vector3VisualizerSource/Vector3ObjectSource.cs b/Vector3Visualizer/Vector3VisualizerSource/Vector3ObjectSource.cs index df330e2..d5b1a9f 100644 --- a/Vector3Visualizer/Vector3VisualizerSource/Vector3ObjectSource.cs +++ b/Vector3Visualizer/Vector3VisualizerSource/Vector3ObjectSource.cs @@ -1,18 +1,30 @@ using Microsoft.VisualStudio.DebuggerVisualizers; +using System.Collections.Generic; +using System.Diagnostics; using System.IO; +using System.Linq; using System.Numerics; namespace Vector3VisualizerSource; public class Vector3ObjectSource : VisualizerObjectSource { - Vector3Model vector3Model = new(); + public Vector3ObjectSource():base() + { + Debug.WriteLine("new Vector3ObjectSource"); + } public override void GetData(object target, Stream outgoingData) { + Vector3Model vector3Model = new(); if (target is Vector3 vector3) { vector3Model.Vector3 = vector3.ToString(); } + if (target is IEnumerable vector3List) + { + vector3Model.Vector3 = vector3List.Last().ToString(); + } + if (target is Quaternion quaternion) { vector3Model.Quaternion = quaternion.ToString(); diff --git a/Vector3Visualizer/Vector3VisualizerTest/Program.cs b/Vector3Visualizer/Vector3VisualizerTest/Program.cs index 6f411e5..c7bb497 100644 --- a/Vector3Visualizer/Vector3VisualizerTest/Program.cs +++ b/Vector3Visualizer/Vector3VisualizerTest/Program.cs @@ -1,6 +1,12 @@  using System.Numerics; -var vector3 = new Vector3(1,2,3); +var a = new Vector3(1,2,3); +var typeName = a.GetType().AssemblyQualifiedName; + +var b = new Vector3(5, 6, 7); +Vector3[] v3Array = [a, b]; +List v3List = v3Array.ToList(); + var quaternion = new Quaternion(1,2,3,4); return; \ No newline at end of file