Skip to content

Instantly share code, notes, and snippets.

@joncloud
Created May 16, 2018 01:48
Show Gist options
  • Select an option

  • Save joncloud/deb289063c495aa866e91d7167f42d5a to your computer and use it in GitHub Desktop.

Select an option

Save joncloud/deb289063c495aa866e91d7167f42d5a to your computer and use it in GitHub Desktop.
Net Framework Installs
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