Created
May 16, 2018 01:48
-
-
Save joncloud/deb289063c495aa866e91d7167f42d5a to your computer and use it in GitHub Desktop.
Net Framework Installs
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| using Microsoft.Win32; | |
| using System; | |
| using System.Collections.Generic; | |
| namespace ConsoleApp55 | |
| { | |
| class Program | |
| { | |
| static void Main(string[] args) | |
| { | |
| foreach (var version in NetFrameworkInstall.GetInstalledFrameworks()) | |
| { | |
| Console.WriteLine(version); | |
| } | |
| } | |
| struct NetFrameworkInstall | |
| { | |
| public string Name { get; } | |
| public Version Version { get; } | |
| public string ServicePack { get; } | |
| NetFrameworkInstall(string name, Version version) | |
| { | |
| Name = name; | |
| Version = version; | |
| ServicePack = ""; | |
| } | |
| NetFrameworkInstall(string name, Version version, string servicePack) | |
| { | |
| Name = name; | |
| Version = version; | |
| ServicePack = servicePack; | |
| } | |
| public override string ToString() => | |
| $"{Name} {Version} {ServicePack}"; | |
| public static IEnumerable<NetFrameworkInstall> GetInstalledFrameworks() | |
| { | |
| return UseNetFrameworkKey(key => new List<NetFrameworkInstall>(GetNetFxVersions(key))); | |
| IEnumerable<NetFrameworkInstall> GetNetFxVersions(RegistryKey ndpKey) | |
| { | |
| foreach (string versionKeyName in ndpKey.GetSubKeyNames()) | |
| { | |
| if (versionKeyName.Length < 1 || versionKeyName[0] != 'v') | |
| { | |
| continue; | |
| } | |
| var versionKey = ndpKey.OpenSubKey(versionKeyName); | |
| var name = (string)versionKey.GetValue("Version", ""); | |
| var sp = versionKey.GetValue("SP", "").ToString(); | |
| var install = versionKey.GetValue("Install", "").ToString(); | |
| if (install != "" && sp != "" && install == "1") | |
| { | |
| yield return new NetFrameworkInstall(versionKeyName, new Version(name), sp); | |
| } | |
| if (name != "") | |
| { | |
| continue; | |
| } | |
| foreach (string subKeyName in versionKey.GetSubKeyNames()) | |
| { | |
| RegistryKey subKey = versionKey.OpenSubKey(subKeyName); | |
| name = (string)subKey.GetValue("Version", ""); | |
| if (name != "") | |
| sp = subKey.GetValue("SP", "").ToString(); | |
| install = subKey.GetValue("Install", "").ToString(); | |
| if (install == "") //no install info, must be later. | |
| yield return new NetFrameworkInstall(versionKeyName, new Version(name)); | |
| else | |
| { | |
| if (sp != "" && install == "1") | |
| { | |
| yield return new NetFrameworkInstall(versionKeyName, new Version(name), sp); | |
| } | |
| else if (install == "1") | |
| { | |
| yield return new NetFrameworkInstall(versionKeyName, new Version(name)); | |
| } | |
| } | |
| } | |
| } | |
| } | |
| TResult UseNetFrameworkKey<TResult>(Func<RegistryKey, TResult> fn) | |
| { | |
| using (var key = OpenNetFrameworkKey()) | |
| { | |
| return fn(key); | |
| } | |
| } | |
| RegistryKey OpenNetFrameworkKey() => | |
| RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, "") | |
| .OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP\"); | |
| } | |
| delegate TResult Func<in T, out TResult>(T arg); | |
| } | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment