using Newtonsoft.Json; using System; using System.IO; using System.Net; using System.Threading.Tasks; using System.Diagnostics; using Amazon; using System.Windows; using Microsoft.VisualStudio.Shell.Interop; using Microsoft.VisualStudio.Shell; using PortingAssistantVSExtensionClient.Models; using Amazon.S3; using Amazon.S3.Model; using System.Windows.Controls; namespace PortingAssistantVSExtensionClient.Utils { public class SupportedVersionsUtil { #region Singleton private SupportedVersionsUtil() { } public static SupportedVersionsUtil Instance { get { return Nested.instance; } } private class Nested { static Nested() { } internal static readonly SupportedVersionsUtil instance = new SupportedVersionsUtil(); } #endregion Singleton private SupportedVersionConfiguration _supportedVersionConfiguration; public SupportedVersionConfiguration SupportedVersionConfiguration { get { if (_supportedVersionConfiguration == null) { _supportedVersionConfiguration = SupportedVersionConfiguration.GetDefaultConfiguration(); } return _supportedVersionConfiguration; } } private Version _visualStudioVersion; public Version VisualStudioVersion { get { if (_visualStudioVersion == null) { ThreadHelper.JoinableTaskFactory.Run(async () => { _visualStudioVersion = await GetVisualStudioVersionAsync(); }); } return _visualStudioVersion; } } /// /// This is the official way to get Visual Studio client version. /// For more information, visit the VsixCommunity github: /// https://github.com/VsixCommunity/Community.VisualStudio.Toolkit/blob/master/demo/VSSDK.TestExtension/ToolWindows/RunnerWindow.cs#L21 /// /// public async Task GetVisualStudioVersionAsync() { await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(); IVsShell shell = await ServiceProvider.GetGlobalServiceAsync(swallowExceptions: false); shell.GetProperty((int)__VSSPROPID5.VSSPROPID_ReleaseVersion, out object value); if (value is string raw) { return Version.Parse(raw.Split(' ')[0]); } return null; } public void UpdateComboBox(ComboBox frameworkComboBox) { frameworkComboBox.Items.Clear(); // Sort based on recommended order. if (SupportedVersionConfiguration?.Versions != null) { foreach (var version in SupportedVersionConfiguration.Versions) { if (Version.TryParse(version.RequiredVisualStudioVersion, out Version requiredVSVersion) && requiredVSVersion <= VisualStudioVersion) { frameworkComboBox.Items.Add(version.DisplayName); } } } } } }