Skip to content

Commit 8c50ae2

Browse files
committed
Fix for image serialization VS2022
1 parent 55b7ef1 commit 8c50ae2

File tree

22 files changed

+732
-62
lines changed

22 files changed

+732
-62
lines changed

src/ImageVisualizer.sln

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,14 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ImageVisualizer17.Common",
2929
EndProject
3030
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ImageVisualizer17.DebuggeeSide", "ImageVisualizer17.DebuggeeSide\ImageVisualizer17.DebuggeeSide.csproj", "{2FAA5BDC-192B-4EB7-A7D1-F69F74BE8223}"
3131
EndProject
32+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ImageVisualizer17.6.DebuggeeSide", "ImageVisualizer17.6.DebuggeeSide\ImageVisualizer17.6.DebuggeeSide.csproj", "{1258707D-E75F-44CA-A5B8-9EB6151F10D1}"
33+
EndProject
34+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ImageVisualizer17.6.Common", "ImageVisualizer17.6.Common\ImageVisualizer17.6.Common.csproj", "{2F389236-8D1B-4410-85A9-6CDEA95A0B38}"
35+
EndProject
36+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ImageVisualizer17.6.UI", "ImageVisualizer17.6.UI\ImageVisualizer17.6.UI.csproj", "{07BD2160-ED5E-4B91-A948-A99400AD4F53}"
37+
EndProject
38+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VSVersionAction", "VSVersionAction\VSVersionAction.csproj", "{B84984BE-B51A-4EB3-BCA0-9476A7C60F18}"
39+
EndProject
3240
Global
3341
GlobalSection(SolutionConfigurationPlatforms) = preSolution
3442
Debug|Any CPU = Debug|Any CPU
@@ -141,6 +149,38 @@ Global
141149
{2FAA5BDC-192B-4EB7-A7D1-F69F74BE8223}.Release|Any CPU.Build.0 = Release|Any CPU
142150
{2FAA5BDC-192B-4EB7-A7D1-F69F74BE8223}.Release|x86.ActiveCfg = Release|Any CPU
143151
{2FAA5BDC-192B-4EB7-A7D1-F69F74BE8223}.Release|x86.Build.0 = Release|Any CPU
152+
{1258707D-E75F-44CA-A5B8-9EB6151F10D1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
153+
{1258707D-E75F-44CA-A5B8-9EB6151F10D1}.Debug|Any CPU.Build.0 = Debug|Any CPU
154+
{1258707D-E75F-44CA-A5B8-9EB6151F10D1}.Debug|x86.ActiveCfg = Debug|Any CPU
155+
{1258707D-E75F-44CA-A5B8-9EB6151F10D1}.Debug|x86.Build.0 = Debug|Any CPU
156+
{1258707D-E75F-44CA-A5B8-9EB6151F10D1}.Release|Any CPU.ActiveCfg = Release|Any CPU
157+
{1258707D-E75F-44CA-A5B8-9EB6151F10D1}.Release|Any CPU.Build.0 = Release|Any CPU
158+
{1258707D-E75F-44CA-A5B8-9EB6151F10D1}.Release|x86.ActiveCfg = Release|Any CPU
159+
{1258707D-E75F-44CA-A5B8-9EB6151F10D1}.Release|x86.Build.0 = Release|Any CPU
160+
{2F389236-8D1B-4410-85A9-6CDEA95A0B38}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
161+
{2F389236-8D1B-4410-85A9-6CDEA95A0B38}.Debug|Any CPU.Build.0 = Debug|Any CPU
162+
{2F389236-8D1B-4410-85A9-6CDEA95A0B38}.Debug|x86.ActiveCfg = Debug|Any CPU
163+
{2F389236-8D1B-4410-85A9-6CDEA95A0B38}.Debug|x86.Build.0 = Debug|Any CPU
164+
{2F389236-8D1B-4410-85A9-6CDEA95A0B38}.Release|Any CPU.ActiveCfg = Release|Any CPU
165+
{2F389236-8D1B-4410-85A9-6CDEA95A0B38}.Release|Any CPU.Build.0 = Release|Any CPU
166+
{2F389236-8D1B-4410-85A9-6CDEA95A0B38}.Release|x86.ActiveCfg = Release|Any CPU
167+
{2F389236-8D1B-4410-85A9-6CDEA95A0B38}.Release|x86.Build.0 = Release|Any CPU
168+
{07BD2160-ED5E-4B91-A948-A99400AD4F53}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
169+
{07BD2160-ED5E-4B91-A948-A99400AD4F53}.Debug|Any CPU.Build.0 = Debug|Any CPU
170+
{07BD2160-ED5E-4B91-A948-A99400AD4F53}.Debug|x86.ActiveCfg = Debug|Any CPU
171+
{07BD2160-ED5E-4B91-A948-A99400AD4F53}.Debug|x86.Build.0 = Debug|Any CPU
172+
{07BD2160-ED5E-4B91-A948-A99400AD4F53}.Release|Any CPU.ActiveCfg = Release|Any CPU
173+
{07BD2160-ED5E-4B91-A948-A99400AD4F53}.Release|Any CPU.Build.0 = Release|Any CPU
174+
{07BD2160-ED5E-4B91-A948-A99400AD4F53}.Release|x86.ActiveCfg = Release|Any CPU
175+
{07BD2160-ED5E-4B91-A948-A99400AD4F53}.Release|x86.Build.0 = Release|Any CPU
176+
{B84984BE-B51A-4EB3-BCA0-9476A7C60F18}.Debug|Any CPU.ActiveCfg = Debug|x86
177+
{B84984BE-B51A-4EB3-BCA0-9476A7C60F18}.Debug|Any CPU.Build.0 = Debug|x86
178+
{B84984BE-B51A-4EB3-BCA0-9476A7C60F18}.Debug|x86.ActiveCfg = Debug|x86
179+
{B84984BE-B51A-4EB3-BCA0-9476A7C60F18}.Debug|x86.Build.0 = Debug|x86
180+
{B84984BE-B51A-4EB3-BCA0-9476A7C60F18}.Release|Any CPU.ActiveCfg = Release|x86
181+
{B84984BE-B51A-4EB3-BCA0-9476A7C60F18}.Release|Any CPU.Build.0 = Release|x86
182+
{B84984BE-B51A-4EB3-BCA0-9476A7C60F18}.Release|x86.ActiveCfg = Release|x86
183+
{B84984BE-B51A-4EB3-BCA0-9476A7C60F18}.Release|x86.Build.0 = Release|x86
144184
EndGlobalSection
145185
GlobalSection(SolutionProperties) = preSolution
146186
HideSolutionNode = FALSE

src/ImageVisualizer14/ImageForm.cs

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
using System;
22
using System.ComponentModel;
33
using System.Drawing;
4+
using System.IO;
45
using System.Runtime.InteropServices;
56
using System.Windows;
67
using System.Windows.Forms;
78
using System.Windows.Media.Imaging;
8-
using Microsoft.VisualStudio.DebuggerVisualizers;
99

1010
namespace Aberus.VisualStudio.Debugger.ImageVisualizer
1111
{
@@ -33,7 +33,7 @@ public static Font UIFont
3333
string dteProgID = "VisualStudio.DTE.15.0";
3434
#elif VS16
3535
string dteProgID = "VisualStudio.DTE.16.0";
36-
#elif VS17
36+
#elif VS17 || VS17_6
3737
string dteProgID = "VisualStudio.DTE.17.0";
3838
#endif
3939
var dte = (EnvDTE.DTE)Marshal.GetActiveObject(dteProgID);
@@ -53,7 +53,7 @@ public static Font UIFont
5353
}
5454
}
5555

56-
public ImageForm(IVisualizerObjectProvider objectProvider)
56+
public ImageForm(object objectBitmap)
5757
{
5858
InitializeComponent();
5959

@@ -67,21 +67,40 @@ public ImageForm(IVisualizerObjectProvider objectProvider)
6767
this.txtExpression.Font = UIFont;
6868
this.btnClose.Font = UIFont;
6969

70-
object objectBitmap = objectProvider.GetObject();
7170
if (objectBitmap != null)
7271
{
7372
#if DEBUG
7473
string expression = objectBitmap.ToString();
7574
#endif
75+
BitmapSource bitmapSource = null;
76+
77+
#if VS17_6
78+
if (objectBitmap is ImageVisualizerImage visualizerImage)
79+
{
80+
txtExpression.Text = visualizerImage.Name + (visualizerImage.Image?.Length ?? -1);
81+
82+
if (visualizerImage.Image != null)
83+
{
84+
var stream = new MemoryStream(visualizerImage.Image);
85+
stream.Seek(0, SeekOrigin.Begin);
86+
87+
var bitmapImage = new BitmapImage();
88+
bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
89+
bitmapImage.BeginInit();
90+
bitmapImage.StreamSource = stream;
91+
bitmapImage.EndInit();
92+
bitmapImage.Freeze();
7693

94+
bitmapSource = bitmapImage;
95+
}
96+
}
97+
#else
7798
var method = objectBitmap.GetType().GetMethod("ToBitmap", new Type[] { });
7899
if (method != null)
79100
{
80101
objectBitmap = method.Invoke(objectBitmap, null);
81102
}
82103

83-
BitmapSource bitmapSource = null;
84-
85104
if (objectBitmap is Bitmap)
86105
{
87106
var hObject = ((Bitmap)objectBitmap).GetHbitmap();
@@ -104,7 +123,7 @@ public ImageForm(IVisualizerObjectProvider objectProvider)
104123
}
105124
}
106125
#if VS16 || VS17
107-
else if(objectBitmap is SerializableBitmap x)
126+
else if (objectBitmap is SerializableBitmap x)
108127
{
109128
var hObject = ((Bitmap)x).GetHbitmap();
110129

@@ -130,14 +149,15 @@ public ImageForm(IVisualizerObjectProvider objectProvider)
130149
{
131150
bitmapSource = serializableBitmapImage;
132151
}
152+
#endif
133153

134154
if (bitmapSource != null)
135155
{
136156
imageControl.SetImage(bitmapSource);
137157
}
158+
159+
txtExpression.Text = objectBitmap.ToString();
138160
}
139-
140-
txtExpression.Text = objectProvider.GetObject().ToString();
141161
}
142162

143163
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)

src/ImageVisualizer14/ImageVisualizer.cs

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
11
using System;
2+
using System.Windows.Forms;
23
using Aberus.VisualStudio.Debugger.ImageVisualizer;
34
using Microsoft.VisualStudio.DebuggerVisualizers;
4-
#if VS16 || VS17
5+
#if VS16 || VS17 || VS17_6
56
using Microsoft.VisualStudio.Utilities;
67
#endif
78

89
// System.Drawing.Bitmap
910
[assembly: System.Diagnostics.DebuggerVisualizer(
1011
typeof(ImageVisualizer),
11-
#if VS16 || VS17
12+
#if VS17_6
13+
typeof(ImageVisualizerJsonObjectSource),
14+
#elif VS16 || VS17
1215
typeof(ImageVisualizerBitmapObjectSource),
1316
#else
1417
typeof(VisualizerObjectSource),
@@ -18,8 +21,12 @@
1821

1922
// System.Windows.Media.Imaging.BitmapImage, System.Windows.Media.Imaging.BitmapSource
2023
[assembly: System.Diagnostics.DebuggerVisualizer(
21-
typeof(ImageVisualizer),
24+
typeof(ImageVisualizer),
25+
#if VS17_6
26+
typeof(ImageVisualizerJsonObjectSource),
27+
#else
2228
typeof(ImageVisualizerObjectSource),
29+
#endif
2330
Target = typeof(System.Windows.Media.Imaging.BitmapSource),
2431
Description = "Image Visualizer")]
2532

@@ -31,8 +38,8 @@ namespace Aberus.VisualStudio.Debugger.ImageVisualizer
3138
public class ImageVisualizer : DialogDebuggerVisualizer
3239
{
3340

34-
#if VS17
35-
public ImageVisualizer() : base(FormatterPolicy.Legacy)
41+
#if VS17_6
42+
public ImageVisualizer() : base(FormatterPolicy.Json)
3643
{
3744

3845
}
@@ -45,12 +52,23 @@ protected override void Show(IDialogVisualizerService windowService, IVisualizer
4552
if (objectProvider == null)
4653
throw new ArgumentNullException(nameof(objectProvider));
4754

48-
#if VS16 || VS17
49-
using (DpiAwareness.EnterDpiScope(DpiAwarenessContext.SystemAware))
50-
#endif
51-
using (var imageForm = new ImageForm(objectProvider))
55+
if (windowService is IWin32Window win32Window)
5256
{
53-
windowService.ShowDialog(imageForm);
57+
58+
#if VS17_6
59+
var debugObject = (objectProvider as IVisualizerObjectProvider3).GetObject<ImageVisualizerImage>();
60+
#else
61+
var debugObject = objectProvider.GetObject();
62+
#endif
63+
64+
65+
#if VS16 || VS17 || VS17_6
66+
using (DpiAwareness.EnterDpiScope(DpiAwarenessContext.PerMonitorAwareV2))
67+
#endif
68+
using (var imageForm = new ImageForm(debugObject))
69+
{
70+
windowService.ShowDialog(imageForm);
71+
}
5472
}
5573
}
5674

src/ImageVisualizer14/Properties/AssemblyInfo.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,5 +32,5 @@
3232
// You can specify all the values or you can default the Build and Revision Numbers
3333
// by using the '*' as shown below:
3434
// [assembly: AssemblyVersion("1.0.*")]
35-
[assembly: AssemblyVersion("1.1.0.0")]
36-
[assembly: AssemblyFileVersion("1.1.0.0")]
35+
[assembly: AssemblyVersion("1.2.0.0")]
36+
[assembly: AssemblyFileVersion("1.2.0.0")]
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
2+
3+
<PropertyGroup>
4+
<TargetFrameworks>netcoreapp3.0;net40</TargetFrameworks>
5+
<RootNamespace>Aberus.VisualStudio.Debugger.ImageVisualizer</RootNamespace>
6+
<UseWPF>true</UseWPF>
7+
<AssemblyName>Aberus.VisualStudio.Debugger.ImageVisualizer.Common</AssemblyName>
8+
<AssemblyVersion>1.2.0.0</AssemblyVersion>
9+
</PropertyGroup>
10+
11+
<ItemGroup Condition="'$(TargetFramework)' == 'netcoreapp3.0'">
12+
<PackageReference Include="System.Drawing.Common">
13+
<Version>4.5.0</Version>
14+
</PackageReference>
15+
</ItemGroup>
16+
17+
</Project>
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
namespace Aberus.VisualStudio.Debugger.ImageVisualizer
2+
{
3+
public class ImageVisualizerImage
4+
{
5+
public string Name { get; set; }
6+
public byte[] Image { get; set; }
7+
}
8+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFrameworks>netcoreapp3.0;net40</TargetFrameworks>
5+
<TargetFramework>net40</TargetFramework>
6+
<RootNamespace>Aberus.VisualStudio.Debugger.ImageVisualizer</RootNamespace>
7+
<UseWPF>true</UseWPF>
8+
<AssemblyName>Aberus.VisualStudio.Debugger.ImageVisualizer.DebuggeeSide</AssemblyName>
9+
<AssemblyVersion>1.2.0.0</AssemblyVersion>
10+
<FileVersion>1.2.0.0</FileVersion>
11+
</PropertyGroup>
12+
13+
<ItemGroup>
14+
<ProjectReference Include="..\ImageVisualizer17.6.Common\ImageVisualizer17.6.Common.csproj" />
15+
</ItemGroup>
16+
17+
<ItemGroup Condition=" '$(TargetFramework)' == 'netcoreapp3.0' ">
18+
<Reference Include="Microsoft.VisualStudio.DebuggerVisualizers">
19+
<Private>False</Private>
20+
<HintPath>C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\Packages\Debugger\Visualizers\netstandard2.0\Microsoft.VisualStudio.DebuggerVisualizers.dll</HintPath>
21+
</Reference>
22+
</ItemGroup>
23+
24+
<ItemGroup Condition=" '$(TargetFramework)' == 'net40' ">
25+
<Reference Include="Microsoft.VisualStudio.DebuggerVisualizers">
26+
<Private>False</Private>
27+
<HintPath>C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\Packages\Debugger\Visualizers\net2.0\Microsoft.VisualStudio.DebuggerVisualizers.dll</HintPath>
28+
</Reference>
29+
</ItemGroup>
30+
31+
<ItemGroup Condition="'$(TargetFramework)' == 'netcoreapp3.0'">
32+
<PackageReference Include="System.Drawing.Common">
33+
<Version>4.7.2</Version>
34+
</PackageReference>
35+
</ItemGroup>
36+
37+
</Project>
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
using Microsoft.VisualStudio.DebuggerVisualizers;
2+
using System;
3+
using System.Drawing;
4+
using System.IO;
5+
using System.Windows.Media.Imaging;
6+
7+
namespace Aberus.VisualStudio.Debugger.ImageVisualizer
8+
{
9+
public class ImageVisualizerJsonObjectSource : VisualizerObjectSource
10+
{
11+
public override void GetData(object target, Stream outgoingData)
12+
{
13+
if (target is Bitmap bitmap)
14+
{
15+
var result = ConvertBitmap(bitmap);
16+
SerializeAsJson(outgoingData, result);
17+
}
18+
else if (target is BitmapSource bitmapSource)
19+
{
20+
var result = ConvertBitmapSource(bitmapSource);
21+
SerializeAsJson(outgoingData, result);
22+
}
23+
}
24+
25+
private object ConvertBitmap(Bitmap bitmap)
26+
{
27+
var imageVisualizerImage = new ImageVisualizerImage
28+
{
29+
Name = bitmap.ToString()
30+
};
31+
32+
if (bitmap != null)
33+
{
34+
using (var memoryStream = new MemoryStream())
35+
{
36+
bitmap.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Png);
37+
38+
imageVisualizerImage.Image = memoryStream.ToArray();
39+
}
40+
}
41+
return imageVisualizerImage;
42+
}
43+
44+
private ImageVisualizerImage ConvertBitmapSource(BitmapSource bitmapSource)
45+
{
46+
47+
var imageVisualizerImage = new ImageVisualizerImage
48+
{
49+
Name = bitmapSource.ToString()
50+
};
51+
52+
if (bitmapSource != null)
53+
{
54+
using (var memoryStream = new MemoryStream())
55+
{
56+
var encoder = new PngBitmapEncoder();
57+
//TODO try/catch
58+
encoder.Frames.Add(BitmapFrame.Create(bitmapSource));
59+
encoder.Save(memoryStream);
60+
memoryStream.Seek(0, SeekOrigin.Begin);
61+
62+
imageVisualizerImage.Image =memoryStream.ToArray();
63+
}
64+
}
65+
return imageVisualizerImage;
66+
}
67+
}
68+
}

0 commit comments

Comments
 (0)