using EnvDTE; using Microsoft.VisualStudio; using Microsoft.VisualStudio.Shell.Interop; using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Versioning; using System.Text; using System.Threading.Tasks; namespace ANX.Framework.VisualStudio { internal class TargetFrameworkMoniker { private string moniker; private string displayName; public string Moniker { get { return this.moniker; } } public TargetFrameworkMoniker(string moniker, string displayName) { this.moniker = moniker; this.displayName = displayName; } public override string ToString() { return this.displayName; } public static IEnumerable<TargetFrameworkMoniker> GetSupportedTargetFrameworkMonikers(IVsFrameworkMultiTargeting vsFrameworkMultiTargeting, Project currentProject) { Array supportedFrameworks; ErrorHandler.ThrowOnFailure(vsFrameworkMultiTargeting.GetSupportedFrameworks(out supportedFrameworks)); Property property = currentProject.Properties.Item("TargetFrameworkMoniker"); FrameworkName currentFramework = new FrameworkName(property.Value.ToString()); List<TargetFrameworkMoniker> result = new List<TargetFrameworkMoniker>(); HashSet<string> hashSet = new HashSet<string>(); bool supportsWebApplications = false; for (int i = 1, count = currentProject.Properties.Count; i <= count; i++) { if (currentProject.Properties.Item(i).Name.StartsWith("WebApplication.")) { supportsWebApplications = true; break; } } foreach (string framework in supportedFrameworks) { if (hashSet.Add(framework)) { FrameworkName frameworkName = new FrameworkName(framework); if (string.Compare(frameworkName.Identifier, currentFramework.Identifier, StringComparison.OrdinalIgnoreCase) == 0) { if (supportsWebApplications) { if (frameworkName.Version.Major < 4 && !string.IsNullOrEmpty(frameworkName.Profile)) { continue; } string resolvedAssemblyPath; if (ErrorHandler.Failed(vsFrameworkMultiTargeting.ResolveAssemblyPath("System.Web.dll", framework, out resolvedAssemblyPath))) { continue; } if (string.IsNullOrEmpty(resolvedAssemblyPath)) { continue; } } string displayName; ErrorHandler.ThrowOnFailure(vsFrameworkMultiTargeting.GetDisplayNameForTargetFx(framework, out displayName)); result.Add(new TargetFrameworkMoniker(framework, displayName)); } } } return result; } } }