diff --git a/Creating custom debug visualizers for Visual Studio 2022.url b/Creating custom debug visualizers for Visual Studio 2022.url
new file mode 100644
index 0000000..ebe0892
--- /dev/null
+++ b/Creating custom debug visualizers for Visual Studio 2022.url
@@ -0,0 +1,2 @@
+[InternetShortcut]
+URL=https://blog.elmah.io/creating-custom-debug-visualizers-for-visual-studio-2022/
diff --git a/MailAddressVisualizer/.vsextension/string-resources.json b/MailAddressVisualizer/.vsextension/string-resources.json
new file mode 100644
index 0000000..097d805
--- /dev/null
+++ b/MailAddressVisualizer/.vsextension/string-resources.json
@@ -0,0 +1,3 @@
+{
+ "MailAddressVisualizer.Command1.DisplayName": "Sample Remote Command"
+}
diff --git a/MailAddressVisualizer/ExtensionEntrypoint.cs b/MailAddressVisualizer/ExtensionEntrypoint.cs
new file mode 100644
index 0000000..1dc7c09
--- /dev/null
+++ b/MailAddressVisualizer/ExtensionEntrypoint.cs
@@ -0,0 +1,31 @@
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.VisualStudio.Extensibility;
+
+namespace MailAddressVisualizer
+{
+ ///
+ /// Extension entrypoint for the VisualStudio.Extensibility extension.
+ ///
+ [VisualStudioContribution]
+ internal class ExtensionEntrypoint : Extension
+ {
+ ///
+ public override ExtensionConfiguration ExtensionConfiguration => new()
+ {
+ Metadata = new(
+ id: "MailAddressVisualizer.3c0400c3-acec-4b09-b561-c11fac7b10a7",
+ version: this.ExtensionAssemblyVersion,
+ publisherName: "Publisher name",
+ displayName: "MailAddressVisualizer",
+ description: "Extension description"),
+ };
+
+ ///
+ protected override void InitializeServices(IServiceCollection serviceCollection)
+ {
+ base.InitializeServices(serviceCollection);
+
+ // You can configure dependency injection here by adding services to the serviceCollection.
+ }
+ }
+}
diff --git a/MailAddressVisualizer/MailAddressDebuggerVisualizerProvider .cs b/MailAddressVisualizer/MailAddressDebuggerVisualizerProvider .cs
new file mode 100644
index 0000000..7730519
--- /dev/null
+++ b/MailAddressVisualizer/MailAddressDebuggerVisualizerProvider .cs
@@ -0,0 +1,24 @@
+using MailAddressVisualizerSource;
+using Microsoft.VisualStudio.Extensibility.DebuggerVisualizers;
+using Microsoft.VisualStudio.RpcContracts.RemoteUI;
+using System.Net.Mail;
+using System.Threading;
+using System.Threading.Tasks;
+namespace MailAddressVisualizer;
+
+internal class MailAddressDebuggerVisualizerProvider : DebuggerVisualizerProvider
+{
+ public override DebuggerVisualizerProviderConfiguration DebuggerVisualizerProviderConfiguration
+ => new("Mail Address Visualizer", typeof(MailAddress));
+
+ public override async Task CreateVisualizerAsync(
+ VisualizerTarget visualizerTarget, CancellationToken cancellationToken)
+ {
+ MailAddressModel? model = await visualizerTarget
+ .ObjectSource
+ .RequestDataAsync(jsonSerializer: null, CancellationToken.None);
+
+ return await Task.FromResult(
+ new MailAddressVisualizerUserControl(model));
+ }
+}
\ No newline at end of file
diff --git a/MailAddressVisualizer/MailAddressVisualizer.csproj b/MailAddressVisualizer/MailAddressVisualizer.csproj
new file mode 100644
index 0000000..214508f
--- /dev/null
+++ b/MailAddressVisualizer/MailAddressVisualizer.csproj
@@ -0,0 +1,24 @@
+
+
+ net8.0-windows8.0
+ enable
+ latest
+ en-US
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/MailAddressVisualizer/MailAddressVisualizer.slnx b/MailAddressVisualizer/MailAddressVisualizer.slnx
new file mode 100644
index 0000000..bf5e8b8
--- /dev/null
+++ b/MailAddressVisualizer/MailAddressVisualizer.slnx
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/MailAddressVisualizer/MailAddressVisualizerUserControl .cs b/MailAddressVisualizer/MailAddressVisualizerUserControl .cs
new file mode 100644
index 0000000..537036d
--- /dev/null
+++ b/MailAddressVisualizer/MailAddressVisualizerUserControl .cs
@@ -0,0 +1,11 @@
+using MailAddressVisualizerSource;
+using Microsoft.VisualStudio.Extensibility.UI;
+
+namespace MailAddressVisualizer;
+
+internal class MailAddressVisualizerUserControl : RemoteUserControl
+{
+ public MailAddressVisualizerUserControl(MailAddressModel? model) : base(model)
+ {
+ }
+}
\ No newline at end of file
diff --git a/MailAddressVisualizer/MailAddressVisualizerUserControl.xaml b/MailAddressVisualizer/MailAddressVisualizerUserControl.xaml
new file mode 100644
index 0000000..0eb7838
--- /dev/null
+++ b/MailAddressVisualizer/MailAddressVisualizerUserControl.xaml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/MailAddressVisualizerSource/MailAddressModel.cs b/MailAddressVisualizerSource/MailAddressModel.cs
new file mode 100644
index 0000000..1f82adc
--- /dev/null
+++ b/MailAddressVisualizerSource/MailAddressModel.cs
@@ -0,0 +1,13 @@
+using System.Runtime.Serialization;
+namespace MailAddressVisualizerSource;
+
+[DataContract]
+public class MailAddressModel
+{
+ [DataMember]
+ public string DisplayName { get; set; } = "";
+
+ [DataMember]
+ public string Email { get; set; } = "";
+}
+
diff --git a/MailAddressVisualizerSource/MailAddressObjectSource .cs b/MailAddressVisualizerSource/MailAddressObjectSource .cs
new file mode 100644
index 0000000..4ab2ad0
--- /dev/null
+++ b/MailAddressVisualizerSource/MailAddressObjectSource .cs
@@ -0,0 +1,20 @@
+using Microsoft.VisualStudio.DebuggerVisualizers;
+using System.Net.Mail;
+
+namespace MailAddressVisualizerSource;
+
+public class MailAddressObjectSource : VisualizerObjectSource
+{
+ public override void GetData(object target, Stream outgoingData)
+ {
+ if (target is MailAddress mail)
+ {
+ var result = new MailAddressModel
+ {
+ DisplayName = mail.DisplayName,
+ Email = mail.Address,
+ };
+ SerializeAsJson(outgoingData, result);
+ }
+ }
+}
\ No newline at end of file
diff --git a/MailAddressVisualizerSource/MailAddressVisualizerSource.csproj b/MailAddressVisualizerSource/MailAddressVisualizerSource.csproj
new file mode 100644
index 0000000..75a4d6a
--- /dev/null
+++ b/MailAddressVisualizerSource/MailAddressVisualizerSource.csproj
@@ -0,0 +1,14 @@
+
+
+
+ netstandard2.0
+ enable
+ enable
+ latest
+
+
+
+
+
+
+
diff --git a/MailAddressVisualizerTest/Program.cs b/MailAddressVisualizerTest/Program.cs
new file mode 100644
index 0000000..3dca162
--- /dev/null
+++ b/MailAddressVisualizerTest/Program.cs
@@ -0,0 +1,7 @@
+// See https://aka.ms/new-console-template for more information
+using System.Net.Mail;
+
+var displayName = "Thomas Ardal";
+var email = "thomas@elmah.io";
+var mailAddress = new MailAddress(email, displayName);
+return;
\ No newline at end of file
diff --git a/MailAddressVisualizerTest/Test.csproj b/MailAddressVisualizerTest/Test.csproj
new file mode 100644
index 0000000..d20809e
--- /dev/null
+++ b/MailAddressVisualizerTest/Test.csproj
@@ -0,0 +1,10 @@
+
+
+
+ Exe
+ net10.0
+ enable
+ enable
+
+
+
diff --git a/MailAddressVisualizerTest/Test.slnx b/MailAddressVisualizerTest/Test.slnx
new file mode 100644
index 0000000..33b33b1
--- /dev/null
+++ b/MailAddressVisualizerTest/Test.slnx
@@ -0,0 +1,3 @@
+
+
+