/// <summary> /// Reads a string value from the specified registry key /// </summary> /// <param name="baseKeyWrapper">wrapper around key</param> /// <param name="valueName">name of the value</param> /// <returns>string data in the value</returns> private static string GetValue(RegistryKeyWrapper wrapper, string valueName) { if (wrapper.Exists()) { object result = wrapper.GetValue(valueName); // RegistryKey.GetValue returns null if the value is not present // and String.Empty if the value is present and no data is defined. // We preserve this distinction, because a string property in the registry with // no value really has an empty string for a value (which is a valid property value) // rather than null for a value (which is an invalid property value) if (result != null) { // Must be a value of string type if (!(result is string)) { InvalidToolsetDefinitionException.Throw("NonStringDataInRegistry", wrapper.Name + "@" + valueName); } return(result.ToString()); } } return(null); }
/// <summary> /// Returns the RegistryKeyWrapper around the sub key with name "name". If that does /// not exist, returns a RegistryKeyWrapper around null. /// </summary> /// <param name="name"></param> /// <returns></returns> public virtual RegistryKeyWrapper OpenSubKey(string name) { ErrorUtilities.VerifyThrowArgumentLength(name, nameof(name)); RegistryKeyWrapper wrapper = this; string[] keyNames = name.Split(new char[] { '\\' }, StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < keyNames.Length && wrapper.Exists(); ++i) { try { wrapper = new RegistryKeyWrapper(wrapper.WrappedKey.OpenSubKey(keyNames[i], false /* not writeable */), registryHive); } catch (Exception ex) { if (NotExpectedException(ex)) { throw; } throw new RegistryException(ex.Message, wrapper.Name + "\\" + keyNames[i], ex); } } return(wrapper); }
/// <summary> /// Provides an enumerator over property definitions for a specified tools version /// </summary> /// <param name="toolsVersion"></param> /// <returns></returns> protected override IEnumerable <PropertyDefinition> GetPropertyDefinitions(string toolsVersion) { RegistryKeyWrapper toolsVersionWrapper = null; try { toolsVersionWrapper = msbuildRegistryWrapper.OpenSubKey("ToolsVersions\\" + toolsVersion); } catch (RegistryException ex) { InvalidToolsetDefinitionException.Throw(ex, "RegistryReadError", ex.Source, ex.Message); } foreach (string propertyName in toolsVersionWrapper.GetValueNames()) { string propertyValue = null; if (propertyName?.Length == 0) { InvalidToolsetDefinitionException.Throw("PropertyNameInRegistryHasZeroLength", toolsVersionWrapper.Name); } try { propertyValue = GetValue(toolsVersionWrapper, propertyName); } catch (RegistryException ex) { InvalidToolsetDefinitionException.Throw(ex, "RegistryReadError", ex.Source, ex.Message); } yield return(new PropertyDefinition(propertyName, propertyValue, toolsVersionWrapper.Name + "@" + propertyName)); } }
/// <summary> /// Constructor overload accepting a registry wrapper for unit testing purposes only /// </summary> /// <param name="msbuildRegistryWrapper"></param> internal ToolsetRegistryReader(RegistryKeyWrapper msbuildRegistryWrapper) { error.VerifyThrowArgumentNull(msbuildRegistryWrapper, nameof(msbuildRegistryWrapper)); this.msbuildRegistryWrapper = msbuildRegistryWrapper; }
/// <summary> /// Returns the RegistryKeyWrapper around the sub key with name "name". If that does /// not exist, returns a RegistryKeyWrapper around null. /// </summary> /// <param name="name"></param> /// <returns></returns> public virtual RegistryKeyWrapper OpenSubKey(string name) { ErrorUtilities.VerifyThrowArgumentLength(name, "name"); RegistryKeyWrapper wrapper = this; string[] keyNames = name.Split(new char[] { '\\' }, StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < keyNames.Length && wrapper.Exists(); ++i) { try { wrapper = new RegistryKeyWrapper(wrapper.WrappedKey.OpenSubKey(keyNames[i], false /* not writeable */), registryHive); } catch (Exception ex) { if (NotExpectedException(ex)) throw; throw new RegistryException(ex.Message, wrapper.Name + "\\" + keyNames[i], ex); } } return wrapper; }
/// <summary> /// Constructor overload accepting a registry wrapper for unit testing purposes only /// </summary> /// <param name="msbuildRegistryWrapper"></param> internal ToolsetRegistryReader(RegistryKeyWrapper msbuildRegistryWrapper) { error.VerifyThrowArgumentNull(msbuildRegistryWrapper, "msbuildRegistryWrapper"); this.msbuildRegistryWrapper = msbuildRegistryWrapper; }
/// <summary> /// Reads a string value from the specified registry key /// </summary> /// <param name="baseKeyWrapper">wrapper around key</param> /// <param name="valueName">name of the value</param> /// <returns>string data in the value</returns> private static string GetValue(RegistryKeyWrapper wrapper, string valueName) { if (wrapper.Exists()) { object result = wrapper.GetValue(valueName); // RegistryKey.GetValue returns null if the value is not present // and String.Empty if the value is present and no data is defined. // We preserve this distinction, because a string property in the registry with // no value really has an empty string for a value (which is a valid property value) // rather than null for a value (which is an invalid property value) if (result != null) { // Must be a value of string type if (!(result is string)) { InvalidToolsetDefinitionException.Throw("NonStringDataInRegistry", wrapper.Name + "@" + valueName); } return result.ToString(); } } return null; }