Skip to content

Commit ec7b163

Browse files
committed
Using message vbox to display installer result message / Simplifying installer wxs file / Deduplicating post-2015 VS registry key datas
1 parent 0396070 commit ec7b163

File tree

5 files changed

+65
-50
lines changed

5 files changed

+65
-50
lines changed

ReadableExpressions.Visualizers.Installer.Custom/ReadableExpressions.Visualizers.Installer.Custom.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
<ItemGroup>
3535
<Reference Include="System" />
3636
<Reference Include="System.Core" />
37+
<Reference Include="System.Windows.Forms" />
3738
<Reference Include="System.Xml.Linq" />
3839
<Reference Include="Microsoft.CSharp" />
3940
<Reference Include="System.Xml" />

ReadableExpressions.Visualizers.Installer.Custom/RegistryData.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public RegistryData(FileVersionInfo thisAssemblyVersion)
2020

2121
if (MsMachineKey == null)
2222
{
23-
ErrorMessage = $"Unable to open '{REGISTRY_KEY}' registry key";
23+
ErrorMessage = $"Unable to open the '{REGISTRY_KEY}' registry key";
2424
NoVisualStudio = true;
2525
return;
2626
}
@@ -32,7 +32,7 @@ public RegistryData(FileVersionInfo thisAssemblyVersion)
3232

3333
if (vsKeyNames.Length == 0)
3434
{
35-
ErrorMessage = $@"Unable to find any '{REGISTRY_KEY}\VisualStudio' registry keys";
35+
ErrorMessage = $@"Unable to find any '{REGISTRY_KEY}\VisualStudio' registry keys from which to determine your Visual Studio install paths";
3636
NoVisualStudio = true;
3737
return;
3838
}
@@ -43,6 +43,8 @@ public RegistryData(FileVersionInfo thisAssemblyVersion)
4343
VsPost2015Data = vsKeyNames
4444
.Where(kn => kn.StartsWith("VisualStudio_"))
4545
.Select(kn => new VsPost2017Data(MsMachineKey.OpenSubKey(kn)))
46+
.GroupBy(d => d.InstallPath)
47+
.Select(grp => grp.First())
4648
.ToArray();
4749
}
4850

@@ -93,7 +95,7 @@ private bool TryPopulateInstallPaths(
9395
PopulatePre2017InstallPath(visualizer, targetVisualizers);
9496
PopulatePost2015InstallPaths(visualizer, targetVisualizers);
9597

96-
return targetVisualizers.Count == 0;
98+
return targetVisualizers.Count > 0;
9799
}
98100

99101
private void PopulatePre2017InstallPath(

ReadableExpressions.Visualizers.Installer.Custom/VisualizerInstallationActions.cs

Lines changed: 38 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ namespace AgileObjects.ReadableExpressions.Visualizers.Installer.Custom
66
using System.IO;
77
using System.Linq;
88
using System.Reflection;
9+
using System.Windows.Forms;
910
using Microsoft.Deployment.WindowsInstaller;
1011

1112
public class VisualizerInstallationActions
@@ -19,7 +20,6 @@ public class VisualizerInstallationActions
1920
private static readonly Lazy<string> _vsixManifestLoader;
2021

2122
private static Session _session;
22-
private static string _resultMessage;
2323

2424
static VisualizerInstallationActions()
2525
{
@@ -60,26 +60,39 @@ private static string GetVsixManifest()
6060
public static ActionResult Install(Session session)
6161
{
6262
#if DEBUG
63-
Debugger.Break();
63+
Debugger.Launch();
6464
#endif
6565
_session = session;
6666

6767
try
6868
{
69-
var installed = new List<string> { "Installed visualizers for:" };
70-
7169
Log("Starting...");
7270

73-
foreach (var visualizer in GetRelevantVisualizers())
71+
if (NoVisualizersToInstall(out var visualizers, out var errorMessage))
72+
{
73+
MessageBox.Show(
74+
errorMessage,
75+
"Error",
76+
MessageBoxButtons.OK,
77+
MessageBoxIcon.Error);
78+
}
79+
80+
var installed = new List<string> { "Installed visualizers for:" };
81+
82+
foreach (var visualizer in visualizers)
7483
{
7584
Log("Installing visualizer " + visualizer.ResourceName + "...");
7685
visualizer.Uninstall();
7786
visualizer.Install();
7887

79-
installed.Add("Visual Studio " + visualizer.VsFullVersionNumber);
88+
installed.Add(" - Visual Studio " + visualizer.VsFullVersionNumber);
8089
}
8190

82-
_resultMessage = string.Join(Environment.NewLine, installed);
91+
MessageBox.Show(
92+
string.Join(Environment.NewLine, installed),
93+
"Complete",
94+
MessageBoxButtons.OK,
95+
MessageBoxIcon.Information);
8396

8497
Log("Complete");
8598

@@ -99,11 +112,17 @@ public static ActionResult Install(Session session)
99112
[CustomAction]
100113
public static ActionResult Uninstall(Session session)
101114
{
115+
#if DEBUG
116+
Debugger.Launch();
117+
#endif
102118
try
103119
{
104-
foreach (var visualizer in GetRelevantVisualizers())
120+
if (TryGetVisualizers(out var visualizers))
105121
{
106-
visualizer.Uninstall();
122+
foreach (var visualizer in visualizers)
123+
{
124+
visualizer.Uninstall();
125+
}
107126
}
108127
}
109128
catch
@@ -114,28 +133,29 @@ public static ActionResult Uninstall(Session session)
114133
return ActionResult.Success;
115134
}
116135

117-
[CustomAction]
118-
public static ActionResult SetResultMessage(Session session)
119-
{
120-
session["WIXUI_EXITDIALOGOPTIONALTEXT"] = _resultMessage;
121-
return ActionResult.Success;
122-
}
136+
private static bool TryGetVisualizers(out IEnumerable<Visualizer> visualizers)
137+
=> NoVisualizersToInstall(out visualizers, out _) != true;
123138

124-
private static IEnumerable<Visualizer> GetRelevantVisualizers()
139+
private static bool NoVisualizersToInstall(out IEnumerable<Visualizer> visualizers, out string errorMessage)
125140
{
126141
using (var registryData = new RegistryData(_thisAssemblyVersion))
127142
{
128143
if (registryData.NoVisualStudio)
129144
{
130-
return Enumerable.Empty<Visualizer>();
145+
visualizers = Enumerable.Empty<Visualizer>();
146+
errorMessage = registryData.ErrorMessage;
147+
return true;
131148
}
132149

133-
return _thisAssembly
150+
visualizers = _thisAssembly
134151
.GetManifestResourceNames()
135152
.WithExtension("dll")
136153
.Select(visualizerResourceName => new Visualizer(Log, _thisAssemblyVersion, VsixManifest, visualizerResourceName))
137154
.SelectMany(visualizer => registryData.GetInstallableVisualizersFor(visualizer))
138155
.ToArray();
156+
157+
errorMessage = null;
158+
return false;
139159
}
140160
}
141161

ReadableExpressions.Visualizers.Installer.Custom/VsPost2017Data.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,15 +36,15 @@ private static string GetVsFullVersion(RegistryKey capabilitiesKey)
3636
{
3737
return null;
3838
}
39-
39+
4040
var vsYearNumber = appName.TrimEnd().Split(' ').LastOrDefault();
4141

4242
if (vsYearNumber == null)
4343
{
4444
return null;
4545
}
4646

47-
return _vsVersionsByYear.TryGetValue(vsYearNumber, out string vsVersionNumber)
47+
return _vsVersionsByYear.TryGetValue(vsYearNumber, out var vsVersionNumber)
4848
? vsVersionNumber : null;
4949
}
5050

ReadableExpressions.Visualizers.Installer/Product.wxs

Lines changed: 19 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -5,45 +5,25 @@
55

66
<Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
77

8-
<UIRef Id="WixUI_Minimal" />
9-
<WixVariable Id="WixUILicenseRtf" Value=".\license.rtf" />
10-
<Property Id="WIXUI_EXITDIALOGOPTIONALTEXT" Value="Install complete" />
11-
128
<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
139
<MediaTemplate />
1410

15-
<Feature Id="ProductFeature" Title="AgileObjects.ReadableExpressions.Visualizers" Level="1">
16-
<ComponentGroupRef Id="ProductComponents" />
17-
</Feature>
18-
19-
<InstallExecuteSequence>
20-
<Custom Action="VisualizersInstall" After="InstallInitialize" />
21-
22-
<Custom Action="VisualizersUninstall" Before="InstallFinalize">
23-
(NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL")
24-
</Custom>
25-
26-
<Custom Action="SetResultMessage" After="InstallFinalize" />
27-
</InstallExecuteSequence>
28-
</Product>
29-
30-
<Fragment>
3111
<Directory Id="TARGETDIR" Name="SourceDir">
3212
<Directory Id="ProgramFilesFolder">
3313
<Directory Id="INSTALLFOLDER" Name="AgileObjects.ReadableExpressions.Visualizers" />
3414
</Directory>
3515
</Directory>
36-
</Fragment>
3716

38-
<Fragment>
3917
<ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
4018
<Component Id="ProductComponent" Guid="3c7ec38f-cf7c-4cdc-845d-50f4f9f85fdf">
4119
<CreateFolder/>
4220
</Component>
4321
</ComponentGroup>
44-
</Fragment>
4522

46-
<Fragment>
23+
<Feature Id="ProductFeature" Title="AgileObjects.ReadableExpressions.Visualizers" Level="1">
24+
<ComponentGroupRef Id="ProductComponents" />
25+
</Feature>
26+
4727
<Binary Id="VisualizersBinary"
4828
SourceFile="$(var.Installer.Custom.TargetDir)\ReadableExpressions.Visualizers.Installer.Custom.CA.dll"/>
4929

@@ -53,7 +33,19 @@
5333
<CustomAction Id="VisualizersUninstall" BinaryKey="VisualizersBinary"
5434
DllEntry="Uninstall" Impersonate="no" Execute="deferred" Return="check"/>
5535

56-
<CustomAction Id="SetResultMessage" BinaryKey="VisualizersBinary"
57-
DllEntry="SetResultMessage" Impersonate="no" Execute="immediate" Return="ignore"/>
58-
</Fragment>
36+
<UI>
37+
<UIRef Id="WixUI_Minimal" />
38+
</UI>
39+
<WixVariable Id="WixUILicenseRtf" Value=".\license.rtf" />
40+
41+
<InstallExecuteSequence>
42+
<Custom Action="VisualizersInstall" After="InstallInitialize">
43+
(NOT REMOVE="ALL")
44+
</Custom>
45+
46+
<Custom Action="VisualizersUninstall" Before="InstallFinalize">
47+
(NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL")
48+
</Custom>
49+
</InstallExecuteSequence>
50+
</Product>
5951
</Wix>

0 commit comments

Comments
 (0)