/// <summary>
 /// Intializes a new instance of the <see cref="RegistryDetector"/>
 /// with the specified root <see cref="RegistryKeyBase"/>.
 /// </summary>
 /// <param name="rootKey">
 /// The root key.
 /// </param>
 /// <exception cref="ArgumentNullException">
 /// If <c>rootKey</c> is <c>null</c>.
 /// </exception>
 public RegistryDetector(RegistryKeyBase rootKey)
 {
     if (rootKey == null)
     {
         throw new ArgumentNullException("rootKey");
     }
     _rootKey = rootKey;
 }
 /// <summary>
 /// Get the .NET 4.0 profiles.
 /// </summary>
 private static DotNetProfiles Get40Profiles(
     RegistryKeyBase key,
     RegistryDetection detection
     )
 {
     return(detection.FullProfileDetected ?
            DotNetProfiles.ClientFull :
            DotNetProfiles.Client);
 }
        /// <summary>
        /// Get the .NET service packs.
        /// </summary>
        internal static IEnumerable <Version> GetServicePacks(
            RegistryKeyBase key,
            RegistryDetection detection
            )
        {
            var keyName = detection.FullProfileRegistryKeyName;

            return(GetServicePacks(key, keyName, "SP"));
        }
 /// <summary>
 /// Get the .NET service packs.
 /// </summary>
 internal static IEnumerable <Version> GetServicePacks(
     RegistryKeyBase key,
     string subKeyName,
     string valueName
     )
 {
     return(key.MatchRegistryValue(subKeyName, valueName, 1) ?
            new[] { new Version("1.0") } :
            key.MatchRegistryValue(subKeyName, valueName, 2) ?
            new[] { new Version("1.0"), new Version("2.0") } :
            new Version[0]);
 }
        /// <summary>
        /// Get the .NET 3.0 service packs.
        /// </summary>
        private static IEnumerable <Version> Get3ServicePack(
            RegistryKeyBase key,
            RegistryDetection detection
            )
        {
            var parentKeyName = RegistryKeyBase.GetParentName(
                key.Hive,
                detection.FullProfileRegistryKeyName
                );

            if (!key.MatchRegistryValue(parentKeyName, "Install", 1))
            {
                return(new Version[0]);
            }
            return(GetServicePacks(key, parentKeyName, "SP"));
        }
        /// <summary>
        /// Detects if the Microsoft .NET Framework version represented by this
        /// detection is installed.
        /// </summary>
        /// <param name="rootKey">
        /// The root <see cref="RegistryKeyBase"/>.
        /// </param>
        /// <returns>
        /// The detected .NET version or <c>null</c> if the version was
        /// not detected.
        /// </returns>
        public DotNetVersion Detect(RegistryKeyBase rootKey)
        {
            Validate();
            var fullProfileRegistryKeyName   = FullProfileRegistryKeyName;
            var clientProfileRegistryKeyName = ClientProfileRegistryKeyName;
            var fullProfileDetected          =
                FullProfileDetected = fullProfileRegistryKeyName != null &&
                                      rootKey.MatchRegistryValue(
                    fullProfileRegistryKeyName,
                    FullProfileValueName,
                    FullProfileValue
                    );
            var clientProfileDetected = ClientProfileDetected =
                fullProfileDetected || (
                    clientProfileRegistryKeyName != null &&
                    rootKey.MatchRegistryValue(
                        clientProfileRegistryKeyName,
                        ClientProfileValueName,
                        ClientProfileValue
                        )
                    );

            if (!fullProfileDetected && !clientProfileDetected)
            {
                return(null);
            }
            if (GetServicePacksDelegate != null)
            {
                VersionBuilder.ServicePacks =
                    GetServicePacksDelegate(rootKey, this);
            }
            if (GetProfilesDelegate != null)
            {
                VersionBuilder.Profiles = GetProfilesDelegate(rootKey, this);
            }
            return(VersionBuilder.DotNetVersion);
        }