From 20a2113e0de0d190501e9290dabcd368fbebcaa9 Mon Sep 17 00:00:00 2001 From: Hefaistos68 Date: Tue, 17 Oct 2023 17:42:42 +0100 Subject: [PATCH] Development (#23) * Updated discovery of VS instances to use the new WMI namespace Microsoft is using since 10/2023. Now discovery tries the original WMI namespace, the new namespace and finally the Setup API. Improvement on #18 * Added continuous GIT status updates Added VS activity log access through a button --- VSLXshared/DataModel/VisualStudioInstance.cs | 5 + .../DataModel/VisualStudioInstanceManager.cs | 167 +++++++++++++----- VSLauncherX/MainDialog.Designer.cs | 103 +++++++---- VSLauncherX/MainDialog.cs | 45 ++++- VSLauncherX/MainDialog.resx | 18 +- VSLauncherX/VSLauncherX.csproj | 2 + 6 files changed, 249 insertions(+), 91 deletions(-) diff --git a/VSLXshared/DataModel/VisualStudioInstance.cs b/VSLXshared/DataModel/VisualStudioInstance.cs index 4420a72..d52f3c0 100644 --- a/VSLXshared/DataModel/VisualStudioInstance.cs +++ b/VSLXshared/DataModel/VisualStudioInstance.cs @@ -59,6 +59,11 @@ public string ShortName /// public string ShortVersion { get { return String.Join('.', this.Version.Split('.').Take(2)); } } + /// + /// Gets the main version number, only major version + /// + public string MainVersion { get { return this.Version.Split('.').First(); } } + /// /// Gets the release year/version /// diff --git a/VSLXshared/DataModel/VisualStudioInstanceManager.cs b/VSLXshared/DataModel/VisualStudioInstanceManager.cs index 43c7233..712bc55 100644 --- a/VSLXshared/DataModel/VisualStudioInstanceManager.cs +++ b/VSLXshared/DataModel/VisualStudioInstanceManager.cs @@ -41,7 +41,7 @@ public class VisualStudioInstanceManager /// public VisualStudioInstanceManager() { - allInstances = ReadAllInstances(); + allInstances = ReadAllInstances() ?? new List(); // just to not crash if no instances are found } /// @@ -67,7 +67,7 @@ public int Count /// Gets the installer path. /// public static string InstallerPath - { + { get { string location = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), "Microsoft Visual Studio", "Installer"); @@ -75,7 +75,7 @@ public static string InstallerPath string installerPath = Path.Combine(location, "vs_installer.exe"); string installerPath86 = Path.Combine(location86, "vs_installer.exe"); - if(Directory.Exists(location) || Directory.Exists(location86)) + if (Directory.Exists(location) || Directory.Exists(location86)) { if (File.Exists(installerPath)) { @@ -114,60 +114,143 @@ public VisualStudioInstance this[string version] } } + /// + /// Reads the all installed Visual Studio instances, using either the original WMI class, the the WMI class in the new namespace, or finally the VS Setup API + /// + /// A list of VisualStudioInstances. + public static List? ReadAllInstances() + { + List? list = null; + + try + { + list = ReadAllInstancesFromWMI1(); + } + catch (System.Exception ex) + { + Debug.WriteLine($"Original MSFT_VSInstance WMi class not found or not able to read. ({ex.Message})"); + } + + if (list is null) + { + try + { + list = ReadAllInstancesFromWMI2(); + } + catch (System.Exception ex) + { + Debug.WriteLine($"New MSFT_VSInstance WMi class not found or not able to read. ({ex.Message})"); + } + } + + if (list is null) + { + try + { + list = ReadAllInstancesFromSetupApi(); + } + catch (System.Exception ex) + { + Debug.WriteLine($"failed to read from VS Setup API, no Visual Studio installation information available. ({ex.Message})"); + } + } + + return list; + } + /// /// Reads the all installed Visual Studio instances from WMI /// /// A list of VisualStudioInstances. - public static List ReadAllInstances() + public static List ReadAllInstancesFromWMI1() { var list = new List(); // read all data from WMI using CimInstance MSFT_VSInstance // https://docs.microsoft.com/en-us/windows/win32/wmisdk/msft-vsinstance - try + ManagementObjectSearcher searcher = new ManagementObjectSearcher { - ManagementObjectSearcher searcher = new ManagementObjectSearcher - { - Query = new SelectQuery("MSFT_VSInstance ", "", new[] { "Name", "Version", "ProductLocation", "IdentifyingNumber" }) - }; - ManagementObjectCollection collection = searcher.Get(); - ManagementObjectCollection.ManagementObjectEnumerator em = collection.GetEnumerator(); - - while (em.MoveNext()) + Query = new SelectQuery("MSFT_VSInstance ", "", new[] { "Name", "Version", "ProductLocation", "IdentifyingNumber" }) + }; + ManagementObjectCollection collection = searcher.Get(); + ManagementObjectCollection.ManagementObjectEnumerator em = collection.GetEnumerator(); + + while (em.MoveNext()) + { + ManagementBaseObject baseObj = em.Current; + if (baseObj.Properties["Version"].Value != null) { - ManagementBaseObject baseObj = em.Current; - if (baseObj.Properties["Version"].Value != null) + try { - try - { - string? name = baseObj.Properties["Name"].Value.ToString(); - string? version = baseObj.Properties["Version"].Value.ToString(); - string? location = baseObj.Properties["ProductLocation"].Value.ToString(); - string? identifier = baseObj.Properties["IdentifyingNumber"].Value.ToString(); - - if (name != null && version != null && location != null && identifier != null) - { - list.Add(new VisualStudioInstance(name, version, location, identifier, VisualStudioInstanceManager.YearFromVersion(version[..2]))); - } - } - catch (Exception ex) + string? name = baseObj.Properties["Name"].Value.ToString(); + string? version = baseObj.Properties["Version"].Value.ToString(); + string? location = baseObj.Properties["ProductLocation"].Value.ToString(); + string? identifier = baseObj.Properties["IdentifyingNumber"].Value.ToString(); + + if (name != null && version != null && location != null && identifier != null) { - Debug.WriteLine(ex.ToString()); + list.Add(new VisualStudioInstance(name, version, location, identifier, VisualStudioInstanceManager.YearFromVersion(version[..2]))); } } + catch (Exception ex) + { + Debug.WriteLine(ex.ToString()); + } } - - em?.Dispose(); - collection?.Dispose(); - searcher?.Dispose(); - } - catch + + em?.Dispose(); + collection?.Dispose(); + searcher?.Dispose(); + + + list.Sort((x, y) => x.Version.CompareTo(y.Version)); + + return list; + } + + public static List ReadAllInstancesFromWMI2() + { + var list = new List(); + // read all data from WMI using CimInstance MSFT_VSInstance but in the new VS namespace + + ManagementScope scope = new ManagementScope("root/cimv2/vs"); + ManagementObjectSearcher searcher = new ManagementObjectSearcher + { + Query = new SelectQuery("MSFT_VSInstance ", "", new[] { "Name", "Version", "ProductLocation", "IdentifyingNumber" }), + Scope = scope + }; + ManagementObjectCollection collection = searcher.Get(); + ManagementObjectCollection.ManagementObjectEnumerator em = collection.GetEnumerator(); + + while (em.MoveNext()) { - // something went wrong, try the alternative way using the Setup API - list = ReadAllInstancesFromSetupApi(); + ManagementBaseObject baseObj = em.Current; + if (baseObj.Properties["Version"].Value != null) + { + try + { + string? name = baseObj.Properties["Name"].Value.ToString(); + string? version = baseObj.Properties["Version"].Value.ToString(); + string? location = baseObj.Properties["ProductLocation"].Value.ToString(); + string? identifier = baseObj.Properties["IdentifyingNumber"].Value.ToString(); + + if (name != null && version != null && location != null && identifier != null) + { + list.Add(new VisualStudioInstance(name, version, location, identifier, VisualStudioInstanceManager.YearFromVersion(version[..2]))); + } + } + catch (Exception ex) + { + Debug.WriteLine(ex.ToString()); + } + } } - + + em?.Dispose(); + collection?.Dispose(); + searcher?.Dispose(); + list.Sort((x, y) => x.Version.CompareTo(y.Version)); return list; @@ -267,7 +350,7 @@ public VsItemList GetRecentProjects(bool bOnlyDefaultInstances) { VsFolder solutionList = new VsFolder(); - var vsDir = new DirectoryInfo(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Microsoft", "VisualStudio")); + var vsDir = new DirectoryInfo(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Microsoft", "VisualStudio")); foreach (var dir in vsDir.GetDirectories("*", SearchOption.AllDirectories)) { @@ -330,7 +413,7 @@ public VsItemList GetRecentProjects(bool bOnlyDefaultInstances) catch (DirectoryNotFoundException) { } - catch(NullReferenceException) + catch (NullReferenceException) { // possibly invalid file } @@ -373,7 +456,7 @@ public VisualStudioInstance GetByName(string name) if (string.IsNullOrEmpty(name)) return HighestVersion(); - var vsi = this.allInstances.Where(x => x.ShortName.Equals(name, StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault(); + var vsi = this.allInstances.Where(x => x.ShortName.Equals(name, StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault(); return vsi is null ? HighestVersion() : vsi; } @@ -388,7 +471,7 @@ public VisualStudioInstance GetByVersion(string? version) if (string.IsNullOrEmpty(version)) return HighestVersion(); - var vsi = this.allInstances.Where(x => x.Version.StartsWith(version, StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault(); + var vsi = this.allInstances.Where(x => x.Version.StartsWith(version, StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault(); return vsi is null ? HighestVersion() : vsi; } diff --git a/VSLauncherX/MainDialog.Designer.cs b/VSLauncherX/MainDialog.Designer.cs index 20095a5..e60b378 100644 --- a/VSLauncherX/MainDialog.Designer.cs +++ b/VSLauncherX/MainDialog.Designer.cs @@ -32,7 +32,7 @@ protected override void Dispose(bool disposing) /// private void InitializeComponent() { - this.components = new System.ComponentModel.Container(); + components = new System.ComponentModel.Container(); ToolStripSeparator toolStripMenuItem1; ToolStripSeparator toolStripMenuItem2; FlowLayoutPanel flowLayoutPanel2; @@ -56,7 +56,7 @@ private void InitializeComponent() olvColumnVersion = new OLVColumn(); olvColumnOptions = new OLVColumn(); optionsRenderer = new MultiImageRenderer(); - imageList3 = new ImageList(this.components); + imageList3 = new ImageList(components); mainPanel = new TableLayoutPanel(); flowLayoutPanel1 = new FlowLayoutPanel(); selectVisualStudioVersion = new VisualStudioCombobox(); @@ -65,10 +65,12 @@ private void InitializeComponent() btnMainStartVisualStudio3 = new Button(); btnMainStartVisualStudio4 = new Button(); btnMainStartVisualStudio5 = new Button(); - imageListMainIcons = new ImageList(this.components); + btnMainOpenActivityLog = new Button(); + btnVsInstaller = new Button(); + imageListMainIcons = new ImageList(components); toolStripStatusLabel3 = new ToolStripStatusLabel(); - tooltipForButtons = new ToolTip(this.components); - ctxMenu = new ContextMenuStrip(this.components); + tooltipForButtons = new ToolTip(components); + ctxMenu = new ContextMenuStrip(components); addToolStripMenuItem = new ToolStripMenuItem(); newGroupToolStripMenuItem = new ToolStripMenuItem(); fromFolderToolStripMenuItem = new ToolStripMenuItem(); @@ -83,7 +85,8 @@ private void InitializeComponent() favoriteToolStripMenuItem = new ToolStripMenuItem(); statusStrip1 = new StatusStrip(); mainStatusLabel = new ToolStripStatusLabel(); - btnVsInstaller = new Button(); + gitTimer = new System.Windows.Forms.Timer(components); + toolStripStatusGit = new ToolStripStatusLabel(); toolStripMenuItem1 = new ToolStripSeparator(); toolStripMenuItem2 = new ToolStripSeparator(); flowLayoutPanel2 = new FlowLayoutPanel(); @@ -455,6 +458,7 @@ private void InitializeComponent() flowLayoutPanel1.Controls.Add(btnMainStartVisualStudio3); flowLayoutPanel1.Controls.Add(btnMainStartVisualStudio4); flowLayoutPanel1.Controls.Add(btnMainStartVisualStudio5); + flowLayoutPanel1.Controls.Add(btnMainOpenActivityLog); flowLayoutPanel1.FlowDirection = FlowDirection.TopDown; flowLayoutPanel1.Location = new Point(699, 0); flowLayoutPanel1.Margin = new Padding(0); @@ -575,6 +579,42 @@ private void InitializeComponent() btnMainStartVisualStudio5.UseVisualStyleBackColor = true; btnMainStartVisualStudio5.Click += btnMainStartVisualStudio5_Click; // + // btnMainOpenActivityLog + // + btnMainOpenActivityLog.Font = new Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point); + btnMainOpenActivityLog.ImageAlign = ContentAlignment.MiddleLeft; + btnMainOpenActivityLog.Location = new Point(0, 400); + btnMainOpenActivityLog.Margin = new Padding(0); + btnMainOpenActivityLog.Name = "btnMainOpenActivityLog"; + btnMainOpenActivityLog.Padding = new Padding(4); + btnMainOpenActivityLog.Size = new Size(232, 32); + btnMainOpenActivityLog.TabIndex = 6; + btnMainOpenActivityLog.Tag = "Open {0} ActivityLog"; + btnMainOpenActivityLog.Text = "Open ActivityLog"; + btnMainOpenActivityLog.TextImageRelation = TextImageRelation.ImageBeforeText; + tooltipForButtons.SetToolTip(btnMainOpenActivityLog, "Opens the activity log file of Visual Studio"); + btnMainOpenActivityLog.UseMnemonic = false; + btnMainOpenActivityLog.UseVisualStyleBackColor = true; + btnMainOpenActivityLog.Click += btnMainOpenActivityLog_Click; + // + // btnVsInstaller + // + btnVsInstaller.Font = new Font("Segoe UI", 10F, FontStyle.Bold, GraphicsUnit.Point); + btnVsInstaller.Image = Resources.ImportVS1; + btnVsInstaller.ImageAlign = ContentAlignment.MiddleLeft; + btnVsInstaller.Location = new Point(699, 449); + btnVsInstaller.Margin = new Padding(0); + btnVsInstaller.Name = "btnVsInstaller"; + btnVsInstaller.Padding = new Padding(4, 0, 4, 0); + btnVsInstaller.Size = new Size(232, 48); + btnVsInstaller.TabIndex = 5; + btnVsInstaller.Tag = ""; + btnVsInstaller.Text = "Visual Studio Installer"; + btnVsInstaller.TextAlign = ContentAlignment.MiddleLeft; + btnVsInstaller.TextImageRelation = TextImageRelation.ImageBeforeText; + btnVsInstaller.UseVisualStyleBackColor = true; + btnVsInstaller.Click += btnVsInstaller_Click; + // // imageListMainIcons // imageListMainIcons.ColorDepth = ColorDepth.Depth8Bit; @@ -692,7 +732,7 @@ private void InitializeComponent() // // statusStrip1 // - statusStrip1.Items.AddRange(new ToolStripItem[] { mainStatusLabel }); + statusStrip1.Items.AddRange(new ToolStripItem[] { mainStatusLabel, toolStripStatusGit }); statusStrip1.Location = new Point(0, 497); statusStrip1.Name = "statusStrip1"; statusStrip1.Size = new Size(933, 22); @@ -702,38 +742,32 @@ private void InitializeComponent() // mainStatusLabel // mainStatusLabel.Name = "mainStatusLabel"; - mainStatusLabel.Size = new Size(193, 17); + mainStatusLabel.Size = new Size(896, 17); + mainStatusLabel.Spring = true; mainStatusLabel.Text = "Lets do something incredible today"; + mainStatusLabel.TextAlign = ContentAlignment.MiddleLeft; // - // btnVsInstaller + // gitTimer // - btnVsInstaller.Font = new Font("Segoe UI", 10F, FontStyle.Bold, GraphicsUnit.Point); - btnVsInstaller.Image = Resources.ImportVS1; - btnVsInstaller.ImageAlign = ContentAlignment.MiddleLeft; - btnVsInstaller.Location = new Point(699, 449); - btnVsInstaller.Margin = new Padding(0); - btnVsInstaller.Name = "btnVsInstaller"; - btnVsInstaller.Padding = new Padding(4, 0, 4, 0); - btnVsInstaller.Size = new Size(232, 48); - btnVsInstaller.TabIndex = 5; - btnVsInstaller.Tag = ""; - btnVsInstaller.Text = "Visual Studio Installer"; - btnVsInstaller.TextAlign = ContentAlignment.MiddleLeft; - btnVsInstaller.TextImageRelation = TextImageRelation.ImageBeforeText; - btnVsInstaller.UseVisualStyleBackColor = true; - btnVsInstaller.Click += btnVsInstaller_Click; + gitTimer.Interval = 1000; + // + // toolStripStatusGit + // + toolStripStatusGit.Name = "toolStripStatusGit"; + toolStripStatusGit.Size = new Size(22, 17); + toolStripStatusGit.Text = "Git"; // // MainDialog // - this.AutoScaleDimensions = new SizeF(7F, 15F); - this.AutoScaleMode = AutoScaleMode.Font; - this.ClientSize = new Size(933, 519); - this.Controls.Add(statusStrip1); - this.Controls.Add(mainPanel); - this.Icon = (Icon)resources.GetObject("$this.Icon"); - this.Margin = new Padding(4, 3, 4, 3); - this.Name = "MainDialog"; - this.Text = "Visual Studio Launcher"; + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(933, 519); + Controls.Add(statusStrip1); + Controls.Add(mainPanel); + Icon = (Icon)resources.GetObject("$this.Icon"); + Margin = new Padding(4, 3, 4, 3); + Name = "MainDialog"; + Text = "Visual Studio Launcher"; FormClosing += MainDialog_FormClosing; Load += MainDialog_Load; flowLayoutPanel2.ResumeLayout(false); @@ -795,6 +829,9 @@ private void InitializeComponent() private ToolStripMenuItem favoriteToolStripMenuItem; private Button btnImportSoP; private Button btnVsInstaller; + private System.Windows.Forms.Timer gitTimer; + private Button btnMainOpenActivityLog; + private ToolStripStatusLabel toolStripStatusGit; } } diff --git a/VSLauncherX/MainDialog.cs b/VSLauncherX/MainDialog.cs index 0d46ffa..b93abfb 100644 --- a/VSLauncherX/MainDialog.cs +++ b/VSLauncherX/MainDialog.cs @@ -259,9 +259,27 @@ private void MainDialog_Load(object sender, EventArgs e) SetupTaskbarTasks(); + gitTimer.Tick += GitTimer_Tick; + gitTimer.Interval = 5000; + gitTimer.Start(); + _ = this.txtFilter.Focus(); } + /// + /// Handles timer ticks to update Git status every 5 seconds + /// + /// + /// + private void GitTimer_Tick(object? sender, EventArgs e) + { + toolStripStatusGit.Visible = true; + FetchGitStatus(this.solutionGroups); + this.olvFiles.Invalidate(); + this.olvFiles.Update(); + toolStripStatusGit.Visible = false; + } + /// /// Finds the visual studio installer and sets up the button. /// @@ -270,8 +288,8 @@ private void FindVisualStudioInstaller() string vsi = VisualStudioInstanceManager.InstallerPath; btnVsInstaller.Tag = vsi; - - if(vsi.StartsWith("http")) + + if (vsi.StartsWith("http")) { btnVsInstaller.Text = "Download Visual Studio"; btnVsInstaller.Image = Resources.Download; @@ -429,7 +447,7 @@ private void MergeNewItem(OLVListItem r, VsItem source) private void SetupTaskbarTasks() { - var cat = new JumpListCustomCategory ( "Test" ); + var cat = new JumpListCustomCategory("Test"); // Create a jump list. this.TaskbarJumpList = JumpList.CreateJumpList(); @@ -1485,6 +1503,25 @@ private void btnMainStartVisualStudio5_Click(object sender, EventArgs e) } } + /// + /// Handles click on the btnMainOpenActivityLog button + /// + /// The sender. + /// The event parameters + private void btnMainOpenActivityLog_Click(object sender, EventArgs e) + { + VisualStudioInstance vs = this.visualStudioInstances[this.selectVisualStudioVersion.SelectedIndex]; + string version = $"{vs.MainVersion}.0_{vs.Identifier}"; + string s = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); + ProcessStartInfo psi = new ProcessStartInfo + { + FileName = $"{s}\\Microsoft\\VisualStudio\\{version}\\ActivityLog.xml", + Verb = "open", + UseShellExecute = true + }; + Process.Start(psi); + } + /// /// Handles click on the btnVsInstaller button /// @@ -1502,7 +1539,7 @@ private void btnVsInstaller_Click(object sender, EventArgs e) { // ask user if installer should be started with elevated privileges bool bIsElevated = AdminInfo.IsCurrentUserAdmin() || AdminInfo.IsElevated(); - + if (!bIsElevated && MessageBox.Show("The Visual Studio Installer may required elevated privileges, do you want to run it as administrator?", "Start installer", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { ProcessStartInfo psi = new ProcessStartInfo diff --git a/VSLauncherX/MainDialog.resx b/VSLauncherX/MainDialog.resx index 2a9614f..20472d8 100644 --- a/VSLauncherX/MainDialog.resx +++ b/VSLauncherX/MainDialog.resx @@ -129,9 +129,6 @@ False - - False - @@ -163,7 +160,7 @@ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vwAADr8BOAVTJAAAAidJREFUSEvtk8trE1EUh7NQ+m/cOJAajVLoIqVCKlnYLNzERTdZSGWCCKULCZTY + vAAADrwBlbxySQAAAidJREFUSEvtk8trE1EUh7NQ+m/cOJAajVLoIqVCKlnYLNzERTdZSGWCCKULCZTY qksNgqSYZTY1pCAjGgJCQiFSWhkSkEDBtI2rNqtmY/Oa7fGew9zr3GQoDcSVHviYe+7j92Ue8ViWBX8T ElSrVchmsxMFM6UAJ8Lh8ETBzP+CC3EVnP/qTIR/UNDr9mhzv9+HbqfnuseJqyASiUDnvDuyWYRX3n+D H/vHNBay4b2CEUGlUoFmswmDwUCRiPDtFwV4zJLEWvAVmIXvIArPFYtFAsdYIwLkYPcQDs2fYA0skriF @@ -242,7 +239,7 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAEZTeXN0ZW0uV2luZG93cy5Gb3JtcywgQ3VsdHVyZT1uZXV0cmFs LCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAmU3lzdGVtLldpbmRvd3MuRm9ybXMu SW1hZ2VMaXN0U3RyZWFtZXIBAAAABERhdGEHAgIAAAAJAwAAAA8DAAAATh4AAAJNU0Z0AUkBTAIBARwB - AAG4AQEBuAEBARABAAEQAQAE/wEJAQAI/wFCAU0BNgEEBgABNgEEAgABKAMAAUADAAGAAwABAQEAAQgG + AAHQAQEB0AEBARABAAEQAQAE/wEJAQAI/wFCAU0BNgEEBgABNgEEAgABKAMAAUADAAGAAwABAQEAAQgG AAEgGAABgAIAAYADAAKAAQABgAMAAYABAAGAAQACgAIAA8ABAAHAAdwBwAEAAfABygGmAQABMwUAATMB AAEzAQABMwEAAjMCAAMWAQADHAEAAyIBAAMpAQADVQEAA00BAANCAQADOQEAAYABfAH/AQACUAH/AQAB kwEAAdYBAAH/AewBzAEAAcYB1gHvAQAB1gLnAQABkAGpAa0CAAH/ATMDAAFmAwABmQMAAcwCAAEzAwAC @@ -377,12 +374,6 @@ False - - 17, 17 - - - False - iVBORw0KGgoAAAANSUhEUgAAADgAAAA4CAYAAACohjseAAAABGdBTUEAALGPC/xhBQAACshJREFUaEPt @@ -651,7 +642,7 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAEZTeXN0ZW0uV2luZG93cy5Gb3JtcywgQ3VsdHVyZT1uZXV0cmFs LCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAmU3lzdGVtLldpbmRvd3MuRm9ybXMu SW1hZ2VMaXN0U3RyZWFtZXIBAAAABERhdGEHAgIAAAAJAwAAAA8DAAAAHA8AAAJNU0Z0AUkBTAIBAQoB - AAGoAQEBqAEBARABAAEQAQAE/wEJAQAI/wFCAU0BNgEEBgABNgEEAgABKAMAAUADAAEwAwABAQEAAQgG + AAHAAQEBwAEBARABAAEQAQAE/wEJAQAI/wFCAU0BNgEEBgABNgEEAgABKAMAAUADAAEwAwABAQEAAQgG AAEMGAABgAIAAYADAAKAAQABgAMAAYABAAGAAQACgAIAA8ABAAHAAdwBwAEAAfABygGmAQABMwUAATMB AAEzAQABMwEAAjMCAAMWAQADHAEAAyIBAAMpAQADVQEAA00BAANCAQADOQEAAYABfAH/AQACUAH/AQAB kwEAAdYBAAH/AewBzAEAAcYB1gHvAQAB1gLnAQABkAGpAa0CAAH/ATMDAAFmAwABmQMAAcwCAAEzAwAC @@ -724,6 +715,9 @@ 829, 17 + + 946, 17 + 94 diff --git a/VSLauncherX/VSLauncherX.csproj b/VSLauncherX/VSLauncherX.csproj index 63edd67..125567d 100644 --- a/VSLauncherX/VSLauncherX.csproj +++ b/VSLauncherX/VSLauncherX.csproj @@ -13,6 +13,8 @@ app.manifest true False + 0.1.4.0 + 0.1.4.0