<PackageReference Include="System.Configuration.ConfigurationManager" Version="5.0.0-preview.4.20251.6" />

ClientSettingsStore

sealed class ClientSettingsStore
using System.Collections; using System.Configuration.Internal; using System.IO; namespace System.Configuration { internal sealed class ClientSettingsStore { private sealed class ClientSettingsConfigurationHost : DelegatingConfigHost { private const string ClientConfigurationHostTypeName = "System.Configuration.ClientConfigurationHost, System.Configuration.ConfigurationManager"; private const string InternalConfigConfigurationFactoryTypeName = "System.Configuration.Internal.InternalConfigConfigurationFactory, System.Configuration.ConfigurationManager"; private static volatile IInternalConfigConfigurationFactory s_configFactory; private IInternalConfigClientHost ClientHost => (IInternalConfigClientHost)base.Host; internal static IInternalConfigConfigurationFactory ConfigFactory { get { if (s_configFactory == null) s_configFactory = TypeUtil.CreateInstance<IInternalConfigConfigurationFactory>("System.Configuration.Internal.InternalConfigConfigurationFactory, System.Configuration.ConfigurationManager"); return s_configFactory; } } private ClientSettingsConfigurationHost() { } public override void Init(IInternalConfigRoot configRoot, params object[] hostInitParams) { } public override void InitForConfiguration(ref string locationSubPath, out string configPath, out string locationConfigPath, IInternalConfigRoot configRoot, params object[] hostInitConfigurationParams) { ConfigurationUserLevel configurationUserLevel = (ConfigurationUserLevel)hostInitConfigurationParams[0]; base.Host = TypeUtil.CreateInstance<IInternalConfigHost>("System.Configuration.ClientConfigurationHost, System.Configuration.ConfigurationManager"); string text; switch (configurationUserLevel) { case ConfigurationUserLevel.None: text = ClientHost.GetExeConfigPath(); break; case ConfigurationUserLevel.PerUserRoaming: text = ClientHost.GetRoamingUserConfigPath(); break; case ConfigurationUserLevel.PerUserRoamingAndLocal: text = ClientHost.GetLocalUserConfigPath(); break; default: throw new ArgumentException(System.SR.UnknownUserLevel); } string text2 = text; base.Host.InitForConfiguration(ref locationSubPath, out configPath, out locationConfigPath, configRoot, null, null, text2); } private bool IsKnownConfigFile(string filename) { if (!string.Equals(filename, ConfigurationManagerInternalFactory.Instance.MachineConfigPath, StringComparison.OrdinalIgnoreCase) && !string.Equals(filename, ConfigurationManagerInternalFactory.Instance.ApplicationConfigUri, StringComparison.OrdinalIgnoreCase) && !string.Equals(filename, ConfigurationManagerInternalFactory.Instance.ExeLocalConfigPath, StringComparison.OrdinalIgnoreCase)) return string.Equals(filename, ConfigurationManagerInternalFactory.Instance.ExeRoamingConfigPath, StringComparison.OrdinalIgnoreCase); return true; } internal static Configuration OpenExeConfiguration(ConfigurationUserLevel userLevel) { return ConfigFactory.Create(typeof(ClientSettingsConfigurationHost), userLevel); } public override Stream OpenStreamForRead(string streamName) { if (IsKnownConfigFile(streamName)) return base.Host.OpenStreamForRead(streamName, true); return base.Host.OpenStreamForRead(streamName); } public override Stream OpenStreamForWrite(string streamName, string templateStreamName, ref object writeContext) { return base.Host.OpenStreamForWrite(streamName, templateStreamName, ref writeContext); } public override void WriteCompleted(string streamName, bool success, object writeContext) { if (string.Equals(streamName, ConfigurationManagerInternalFactory.Instance.ExeLocalConfigPath, StringComparison.OrdinalIgnoreCase) || string.Equals(streamName, ConfigurationManagerInternalFactory.Instance.ExeRoamingConfigPath, StringComparison.OrdinalIgnoreCase)) base.Host.WriteCompleted(streamName, success, writeContext, true); else base.Host.WriteCompleted(streamName, success, writeContext); } } private const string ApplicationSettingsGroupName = "applicationSettings"; private const string UserSettingsGroupName = "userSettings"; private const string ApplicationSettingsGroupPrefix = "applicationSettings/"; private const string UserSettingsGroupPrefix = "userSettings/"; private Configuration GetUserConfig(bool isRoaming) { ConfigurationUserLevel userLevel = isRoaming ? ConfigurationUserLevel.PerUserRoaming : ConfigurationUserLevel.PerUserRoamingAndLocal; return ClientSettingsConfigurationHost.OpenExeConfiguration(userLevel); } private ClientSettingsSection GetConfigSection(Configuration config, string sectionName, bool declare) { string sectionName2 = "userSettings/" + sectionName; ClientSettingsSection clientSettingsSection = null; if (config != null) { clientSettingsSection = (config.GetSection(sectionName2) as ClientSettingsSection); if ((clientSettingsSection == null) & declare) { DeclareSection(config, sectionName); clientSettingsSection = (config.GetSection(sectionName2) as ClientSettingsSection); } } return clientSettingsSection; } private void DeclareSection(Configuration config, string sectionName) { ConfigurationSectionGroup sectionGroup = config.GetSectionGroup("userSettings"); if (sectionGroup == null) { ConfigurationSectionGroup sectionGroup2 = new UserSettingsGroup(); config.SectionGroups.Add("userSettings", sectionGroup2); } sectionGroup = config.GetSectionGroup("userSettings"); if (sectionGroup != null) { ConfigurationSection configurationSection = sectionGroup.Sections[sectionName]; if (configurationSection == null) { configurationSection = new ClientSettingsSection(); configurationSection.SectionInformation.AllowExeDefinition = ConfigurationAllowExeDefinition.MachineToLocalUser; configurationSection.SectionInformation.RequirePermission = false; sectionGroup.Sections.Add(sectionName, configurationSection); } } } internal IDictionary ReadSettings(string sectionName, bool isUserScoped) { IDictionary dictionary = new Hashtable(); if (isUserScoped && !ConfigurationManagerInternalFactory.Instance.SupportsUserConfig) return dictionary; string str = isUserScoped ? "userSettings/" : "applicationSettings/"; ConfigurationManager.RefreshSection(str + sectionName); ClientSettingsSection clientSettingsSection = ConfigurationManager.GetSection(str + sectionName) as ClientSettingsSection; if (clientSettingsSection != null) { foreach (SettingElement setting in clientSettingsSection.Settings) { dictionary[setting.Name] = new StoredSetting(setting.SerializeAs, setting.Value.ValueXml); } return dictionary; } return dictionary; } internal static IDictionary ReadSettingsFromFile(string configFileName, string sectionName, bool isUserScoped) { IDictionary dictionary = new Hashtable(); if (isUserScoped && !ConfigurationManagerInternalFactory.Instance.SupportsUserConfig) return dictionary; string str = isUserScoped ? "userSettings/" : "applicationSettings/"; ExeConfigurationFileMap exeConfigurationFileMap = new ExeConfigurationFileMap(); ConfigurationUserLevel userLevel = isUserScoped ? ConfigurationUserLevel.PerUserRoaming : ConfigurationUserLevel.None; if (isUserScoped) { exeConfigurationFileMap.ExeConfigFilename = ConfigurationManagerInternalFactory.Instance.ApplicationConfigUri; exeConfigurationFileMap.RoamingUserConfigFilename = configFileName; } else exeConfigurationFileMap.ExeConfigFilename = configFileName; Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(exeConfigurationFileMap, userLevel); ClientSettingsSection clientSettingsSection = configuration.GetSection(str + sectionName) as ClientSettingsSection; if (clientSettingsSection != null) { foreach (SettingElement setting in clientSettingsSection.Settings) { dictionary[setting.Name] = new StoredSetting(setting.SerializeAs, setting.Value.ValueXml); } return dictionary; } return dictionary; } internal ConnectionStringSettingsCollection ReadConnectionStrings() { return PrivilegedConfigurationManager.ConnectionStrings; } internal void RevertToParent(string sectionName, bool isRoaming) { if (!ConfigurationManagerInternalFactory.Instance.SupportsUserConfig) throw new ConfigurationErrorsException(System.SR.UserSettingsNotSupported); Configuration userConfig = GetUserConfig(isRoaming); ClientSettingsSection configSection = GetConfigSection(userConfig, sectionName, false); if (configSection != null) { configSection.SectionInformation.RevertToParent(); userConfig.Save(); } } internal void WriteSettings(string sectionName, bool isRoaming, IDictionary newSettings) { if (!ConfigurationManagerInternalFactory.Instance.SupportsUserConfig) throw new ConfigurationErrorsException(System.SR.UserSettingsNotSupported); Configuration userConfig = GetUserConfig(isRoaming); ClientSettingsSection configSection = GetConfigSection(userConfig, sectionName, true); if (configSection == null) throw new ConfigurationErrorsException(System.SR.SettingsSaveFailedNoSection); SettingElementCollection settings = configSection.Settings; IDictionaryEnumerator enumerator = newSettings.GetEnumerator(); try { while (enumerator.MoveNext()) { DictionaryEntry dictionaryEntry = (DictionaryEntry)enumerator.Current; SettingElement settingElement = settings.Get((string)dictionaryEntry.Key); if (settingElement == null) { settingElement = new SettingElement(); settingElement.Name = (string)dictionaryEntry.Key; settings.Add(settingElement); } StoredSetting storedSetting = (StoredSetting)dictionaryEntry.Value; settingElement.SerializeAs = storedSetting.SerializeAs; settingElement.Value.ValueXml = storedSetting.Value; } } finally { (enumerator as IDisposable)?.Dispose(); } try { userConfig.Save(); } catch (ConfigurationErrorsException ex) { throw new ConfigurationErrorsException(System.SR.Format(System.SR.SettingsSaveFailed, ex.Message), ex); } } } }