public static int Compare(NETVersionInfo a, NETVersionInfo b)
            {
                var ar = a.InstalledVersion.Split('.');
                var br = b.InstalledVersion.Split('.');

                for (int i = 0, l = Math.Min(ar.Length, br.Length); i < l; i++)
                {
                    int ai;
                    int bi;
                    if (!int.TryParse(ar[i], out ai))
                    {
                        ai = 0;
                    }
                    if (!int.TryParse(br[i], out bi))
                    {
                        bi = 0;
                    }
                    if (ai != bi)
                    {
                        return(bi - ai);
                    }
                }
                int d = br.Length - ar.Length;

                if (d != 0)
                {
                    return(d);
                }
                if (b.Type == "Full" && a.Type != "Full")
                {
                    return(1);
                }
                if (a.Type == "Full" && b.Type != "Full")
                {
                    return(-1);
                }
                return(0);
            }
        // The example displays output similar to the following:
        //        v2.0.50727  2.0.50727.4927  SP2
        //        v3.0  3.0.30729.4926  SP2
        //        v3.5  3.5.30729.4926  SP1
        //        v4.0
        //        Client  4.0.0.0
        public static CLRInfo GetCLRInfo()
        {
            CLRInfo        rv = new CLRInfo();
            NETVersionInfo highestInstalledNETVersion = new NETVersionInfo()
            {
                InstalledVersion = ""
            };

            RegistryKey baseKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32);

            rv.RawClrVersion = Environment.Version.ToString();

            const string subkey = @"SOFTWARE\Microsoft\NET Framework Setup\NDP\";

            // Opens the registry key for the .NET Framework entry.
            using (var ndpKey = baseKey.OpenSubKey(subkey))
            {
                foreach (var versionKeyName in ndpKey.GetSubKeyNames())
                {
                    if (versionKeyName.StartsWith("v"))
                    {
                        //rv.NETVersionsInstalled.Add(versionKeyName.Substring(1));

                        using (RegistryKey versionKey = ndpKey.OpenSubKey(versionKeyName))
                        {
                            // Get the .NET Framework version value.
                            var name = (string)versionKey.GetValue("Version", "");
                            // Get the service pack (SP) number.
                            var sp             = versionKey.GetValue("SP", "").ToString();
                            var releaseVersion = versionKey.GetValue("Release");
                            int releaseKey     = releaseVersion as int? ?? 0;

                            // Get the installation flag, or an empty string if there is none.
                            var install = versionKey.GetValue("Install", "").ToString();
                            if (string.IsNullOrEmpty(install)) // No install info; it must be in a child subkey.
                            {
                                //Console.WriteLine($"{versionKeyName}  {name}");
                            }
                            else if (install == "1")
                            {
                                NETVersionInfo rec = new NETVersionInfo()
                                {
                                    Version          = versionKeyName,
                                    InstalledVersion = name,
                                    ServicePack      = sp,
                                    ReleaseKey       = releaseKey
                                };
                                if (highestInstalledNETVersion < rec)
                                {
                                    highestInstalledNETVersion = rec;
                                }
                                if (!rv.NETVersionsInstalled.Contains(rec))
                                {
                                    rv.NETVersionsInstalled.Add(rec);
                                }
                            }
                            if (!string.IsNullOrEmpty(name))
                            {
                                continue;
                            }

                            foreach (var subKeyName in versionKey.GetSubKeyNames())
                            {
                                using (RegistryKey subKey = versionKey.OpenSubKey(subKeyName))
                                {
                                    name = (string)subKey.GetValue("Version", "");
                                    if (!string.IsNullOrEmpty(name))
                                    {
                                        sp             = subKey.GetValue("SP", "").ToString();
                                        releaseVersion = subKey.GetValue("Release");
                                        releaseKey     = releaseVersion as int? ?? 0;

                                        string v = versionKeyName;
                                        if (releaseKey > 0)
                                        {
                                            v = CheckFor45PlusVersion(releaseKey);
                                        }

                                        install = subKey.GetValue("Install", "").ToString();
                                        if (install == "1")
                                        {
                                            if (versionKeyName == "v4")
                                            {
                                                rv.NET4TypesInstalled.Add(subKeyName);

                                                if (subKeyName == "Client")
                                                {
                                                    rv.IsNET4ClientInstalled = true;
                                                }
                                                if (subKeyName == "Full")
                                                {
                                                    rv.IsNET4FullInstalled = true;
                                                }
                                            }

                                            NETVersionInfo rec = new NETVersionInfo()
                                            {
                                                Version          = v,
                                                Type             = subKeyName,
                                                InstalledVersion = name,
                                                ServicePack      = sp,
                                                ReleaseKey       = releaseKey
                                            };
                                            if (highestInstalledNETVersion < rec)
                                            {
                                                highestInstalledNETVersion = rec;
                                            }
                                            if (!rv.NETVersionsInstalled.Contains(rec))
                                            {
                                                rv.NETVersionsInstalled.Add(rec);
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }

            if (String.IsNullOrEmpty(highestInstalledNETVersion.InstalledVersion))
            {
                rv.Version = null;
            }
            else
            {
                rv.Version = highestInstalledNETVersion;
            }

            return(rv);
        }