<configuration>
<configSections>
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="ConsoleApplication2.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="ConsoleApplication2.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</sectionGroup>
</configSections>
<appSettings>
<add key="key A" value="A value" />
</appSettings>
<connectionStrings>
<add name="conn" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=F:\C#Code\DBOperation\ykjj.mdb" />
</connectionStrings>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6" />
</startup>
<userSettings>
<ConsoleApplication2.Properties.Settings>
<setting name="UserKey1" serializeAs="String">
<value>Value for UserKey1</value>
</setting>
<setting name="UserKey2" serializeAs="String">
<value>Value for UserKey2</value>
</setting>
</ConsoleApplication2.Properties.Settings>
</userSettings>
<applicationSettings>
<ConsoleApplication2.Properties.Settings>
<setting name="ApplicationKey1" serializeAs="String">
<value>ApplicationValue2</value>
</setting>
<setting name="ApplicationKey2" serializeAs="String">
<value>ApplicationValue2</value>
</setting>
</ConsoleApplication2.Properties.Settings>
</applicationSettings>
</configuration>
Config中常見的標籤包含:
userSetting and applicationSetting 合稱為應用程式設定(Properties.Settings),用與建立和存取在應用程式執行會話之間保存的值。 這些值稱為「 設定」。 設定可以代表使用者喜好設定,或應用程式需要使用的重要資訊。
應用程式設定的config標籤生成方式可以參考官方的方式;
[屬性] > [設定] > [建立使用者設定]
userSetting 和 applicationSetting 的差別在於能不能在程式運行期間對設定屬性進行修改,主要分別記錄使用者的偏好設定和應用程式的相關設定.
都過上面的方式新增key和value,app.config 或 web.config 檔案中會自動產生相關配置(configSections 和 設定標籤)
//方法一: 用屬性的方式讀,自動轉換型別
string a = Properties.Settings.Default.UserKey1;
//方法二: 用Key Name的方式讀取,讀取的型態為object,需要自行轉換
string a = Properties.Settings.Default["UserKey1"].ToString();
//方法一: 修改屬性
Properties.Settings.Default.UserKey1 = "new user1 value";
//applicaitonSettings無法在執行過程中修改設定,程式碼會報錯
//Properties.Settings.Default.ApplicationKey1 = "new Application1 value";
//方法二: Key_Value的方式修改
Properties.Settings.Default["UserKey1"] = "new user1 value";
//使用Key_Value的方式可以針對ApplicationSettings的值進行修改(算不算Bug???)
Properties.Settings.Default["ApplicationKey1"] = "new Application1 value";
//修改後的新值在該次執行中可以使用,程式重新啟動後,該值將恢復系統使用者數據或Config設定的值
//調用Save()將修改的設定儲存到系統使用者數據中,只會儲存 userSettings 的數據
Properties.Settings.Default.Save();
注1: Save()是將數據儲存到系統使用者數據中,並不會實際修改程式的exe.config配置檔案.
注2: Save()只會將userSettings的值儲存到系統使用者設定中,applicationSettings的資料不會儲存.
Save:将settings“用户”范围的属性写入到系统中, settings实例后,在程序中被赋予新值,如果想保存这些值以便在程序下一次运行时使用,就可以调用Save保存
例:Properties.Settings.Default.Save();
Reload:从系统或App.config中读取已保存的值刷新当前内存里“用户”范围的属性。先检查系统,当系统中没有保存时再从app.config中获取
例:Properties.Settings.Default.Reload();
Reset:清空系统中保存的settings,并且从app.config中刷新内存里“用户”范围的属性。
例:Properties.Settings.Default.Reset();
Upgrade:当程序安装多个时,从最新的一个程序所保存在系统的值读取出来并刷新内存里“用户”范围的属性。
例:Properties.Settings.Default.Upgrade();
這一小段是我個人測試得出來的結果整理,實際原理跟讀取邏輯我還是不太懂,如果有錯誤或是有人知道其中的原理再麻煩解答,謝謝!
應用程式設定(Properties.Settings)的使用方式在app.config 和 web.config 大致上是相同的,其中我測試除了一些差異:
config檔案路差異
- app.config 套用的是 [app].exe 同層的 [app].exe.config 檔案
- web.config 套用的是專案中的 web.config (不知道是不是應為我IIS部署的關係)
Web Application 沒有 UserSetting
- Web Application 的 Properties.Setting Scope 選項默認只有Application
Property.Settings 的讀取順序
- 在 Build 的時候會先寫入預設初始設定值到程式中
- 程式開啟時:
- userSetting
- 到系統使用者數據中尋找是否有該程式的使用者設定數據,讀取出來使用
- 如果系統使用者數據中沒有設定資料,則讀取對應 .config 檔案中的設定
- 如果沒有找到 .config 則是用默認預設值
- applicationSetting
- 讀取對應 .config 檔案中的設定
- 沒有 .config 則是用默認預設值
<userSettings>
<ConsoleApplication2.Properties.Settings>
<setting name="UserKey1" serializeAs="String">
<value>Value for UserKey1</value>
</setting>
</ConsoleApplication2.Properties.Settings>
</userSettings>
<applicationSettings>
<ConsoleApplication2.Properties.Settings>
<setting name="ApplicationKey1" serializeAs="String">
<value>ApplicationValue1</value>
</setting>
</ConsoleApplication2.Properties.Settings>
</applicationSettings>
Console.WriteLine(Properties.Settings.Default.UserKey1);
Console.WriteLine(Properties.Settings.Default.ApplicationKey1);
Value for UserKey1 (輸出預設值)
ApplicationValue1
<userSettings>
<ConsoleApplication2.Properties.Settings>
<setting name="UserKey1" serializeAs="String">
<value>Config Value1</value>
</setting>
</ConsoleApplication2.Properties.Settings>
</userSettings>
<applicationSettings>
<ConsoleApplication2.Properties.Settings>
<setting name="ApplicationKey1" serializeAs="String">
<value>Config ApplicationValue1</value>
</setting>
</ConsoleApplication2.Properties.Settings>
</applicationSettings>
Console.WriteLine(Properties.Settings.Default.UserKey1);
Console.WriteLine(Properties.Settings.Default.ApplicationKey1);
Config Value1 (輸出config設定的值)
Config ApplicationValue1
Properties.Settings.Default["UserKey1"] = "Modified UserKey1";
Properties.Settings.Default["ApplicationKey1"] = "Modified ApplicationKey1";
Console.WriteLine(Properties.Settings.Default.UserKey1);
Console.WriteLine(Properties.Settings.Default.ApplicationKey1);
Modified UserKey1
Modified ApplicationKey1 (ApplicationSetting 修改在當此執行中有效)
Console.WriteLine(Properties.Settings.Default.UserKey1);
Console.WriteLine(Properties.Settings.Default.ApplicationKey1);
Properties.Settings.Default["UserKey1"] = "Modified UserKey1";
Properties.Settings.Default["ApplicationKey1"] = "Modified ApplicationKey1";
Properties.Settings.Default.Save();
Console.WriteLine(Properties.Settings.Default.UserKey1);
Console.WriteLine(Properties.Settings.Default.ApplicationKey1);
Config Value1 (上一步修改並未儲存,故輸出config設定的值)
Config ApplicationValue1
Modified UserKey1
Modified ApplicationKey1 (ApplicationSetting 修改在當此執行中有效)
Console.WriteLine(Properties.Settings.Default.UserKey1);
Console.WriteLine(Properties.Settings.Default.ApplicationKey1);
Modified UserKey1 (系統使用者設定內儲存的資料)
Config ApplicationValue1 (congif設定的資料)
接下來再來看看和結構.
需要加入參考 System.Configuration.dll
引用 using System.configuration;
web application 需要額外 using System.Web.Configuration;
//讀取
System.Configuration.ConfigurationManager.AppSettings["key A"];
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
AppSettingsSection app = config.AppSettings;
//新增
app.Settings.Add("A", "A value");
config.Save(ConfigurationSaveMode.Modified);
//修改
app.Settings["A"].Value = "New A value";
config.Save(ConfigurationSaveMode.Modified);
//刪除
app.Settings.Remove("A");
config.Save(ConfigurationSaveMode.Modified);
//RefreshSection : 修改後config物件需要RefreshSection,來重新更新Section內的資訊
ConfigurationManager.RefreshSection(config.AppSettings.SectionInformation.Name);
//讀取
string str_conn = System.Configuration.ConfigurationManager.ConnectionStrings["conn"];
//打開用戶端的config
System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
//appSettings結構
string sectionName = config.ConnectionStrings.SectionInformation.Name;
ConnectionStringsSection section = config.ConnectionStrings;
//建立連線字串
ConnectionStringSettings csSettings = new ConnectionStringSettings("conn", "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=F:\C#Code\DBOperation\ykjj.mdb");
//新增
section.ConnectionStrings.Add(csSettings);
section.ConnectionStrings.Add("name", "stringvalue");
//移除
section.ConnectionStrings.Remove(csSettings);
section.ConnectionStrings.Remove("conn");
section.ConnectionStrings.RemoveAt(0);
//修改
section.ConnectionStrings["conn"].ConnectionString = "value";
config.Save(ConfigurationSaveMode.Full);
參考文章: