C# Tips

C# Tip Article

Using Application-specific Settings

Application Settings allows you to store and retrieve property settings and other information for your application dynamically. Settings page can be accessed by double-clicking Properties\Settings.settings in Solution Explorer. Alternatively it can also be accessed via Project Properties -> Settings tab.

When double-clicking Properties\Settings.settings file, one can define application-scoped settings and/or user-scoped settings as shown below.

Properties Settings.settings

Settings can be accessed from "Properties.Settings.Default" in C#. With "Properties.Settings.Default," application-scoped settings are read-only whereas user-scoped settings are read-write.

When the application is built after Settings are defined in VS designer, application config file (ex: WinFormApp.exe.config) will include userSettings and/or applicationSettings with their default values if any.

	<?xml version="1.0" encoding="utf-8" ?>
	<configuration>
		<configSections>
			<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
				<section name="WinFormApp.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
			</sectionGroup>
			<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
				<section name="WinFormApp.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
			</sectionGroup>
		</configSections>
		<startup> 
			<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
		</startup>
		<userSettings>
			<WinFormApp.Properties.Settings>
				<setting name="userData" serializeAs="String">
					<value>USER</value>
				</setting>
			</WinFormApp.Properties.Settings>
		</userSettings>
		<applicationSettings>
			<WinFormApp.Properties.Settings>
				<setting name="appData" serializeAs="String">
					<value>APP</value>
				</setting>
			</WinFormApp.Properties.Settings>
		</applicationSettings>
	</configuration>

Any kind settings can be read by using Properties.Settings.Default. User-scoped settings can be updated as below. When user-scoped settings are updated, they are saved to user.config file under each user's profile directory. For example, user-scoped settings of WinFormApp.exe were saved to the following folder in my Windows 10 (without roaming profile) : C:\Users\{username}\AppData\Local\WinFormApp\WinFormApp.exe_Url_02z2xff0zxapye5pmgcdih0lygdijlnz\1.0.0.0\user.config

	Properties.Settings.Default.userData = "USR 101";
	Properties.Settings.Default.Save();

Application-scoped settings can be updated programmatically by using ConfigurationManager. When application-scoped settings are updated in C#, the settings will be saved to application config file (ex: WinFormApp.exe.config) in the application folder.

	// using System.Configuration;
	Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

	ConfigurationSectionGroup applicationSectionGroup = config.GetSectionGroup("applicationSettings");
	ConfigurationSection applicationConfigSection = applicationSectionGroup.Sections["WinFormApp.Properties.Settings"];
	ClientSettingsSection clientSection = (ClientSettingsSection)applicationConfigSection;

	SettingElement appData = clientSection.Settings.Get("appData");
	appData.Value.ValueXml.InnerText = "APP 101";
	applicationConfigSection.SectionInformation.ForceSave = true;
	config.Save();