iT邦幫忙

1

前言

Config好像是寫程式的基礎操作之一,但由於前一份工作比較少用到Config設定的關係,沒有很仔細的研究過它的用法.然而新工作的使用頻率較高,加上WEB跟WinForm在Config的使用上又分為app.config及web.config,實在讓我有點混亂.
這篇文章整理了我學習研究Config的筆記,其中還有一些我沒有很清楚或是有錯誤的地方,還請前輩指教.
PS. 本文主要以基礎用法為主.進階的自訂配置標籤後續再整理

範例Config

<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標籤

Config中常見的標籤包含:

  • userSettings
  • applicationSettings
  • appSettings
  • connectionStrings
    他們的讀取及修改方式都有所不同.

userSetting and applicationSetting

userSetting and applicationSetting 合稱為應用程式設定(Properties.Settings),用與建立和存取在應用程式執行會話之間保存的值。 這些值稱為「 設定」。 設定可以代表使用者喜好設定,或應用程式需要使用的重要資訊。

應用程式設定的config標籤生成方式可以參考官方的方式;
[屬性] > [設定] > [建立使用者設定]

userSetting 和 applicationSetting 的差別在於能不能在程式運行期間對設定屬性進行修改,主要分別記錄使用者的偏好設定和應用程式的相關設定.
Setting.Setting
都過上面的方式新增key和value,app.config 或 web.config 檔案中會自動產生相關配置(configSections 和 設定標籤)

  • Name - Key或設定名稱
  • Type - 設定的屬性型態
  • Scope - user / application Settings
  • Value - 設定的值

讀取

//方法一: 用屬性的方式讀,自動轉換型別
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的資料不會儲存.

Properties.Settings.Default 方法

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();

??App.Config 跟 Web.Config 中的差異??

這一小段是我個人測試得出來的結果整理,實際原理跟讀取邏輯我還是不太懂,如果有錯誤或是有人知道其中的原理再麻煩解答,謝謝!

  • app.config 的使用環境為window application, 像是 winform 或 console application
  • web.config 則是主要在網絡環境下的專案, 如 web service 或 web API

應用程式設定(Properties.Settings)的使用方式在app.config 和 web.config 大致上是相同的,其中我測試除了一些差異:

config檔案路差異
- app.config 套用的是 [app].exe 同層的 [app].exe.config 檔案
- web.config 套用的是專案中的 web.config (不知道是不是應為我IIS部署的關係)
config location

Web Application 沒有 UserSetting
- Web Application 的 Properties.Setting Scope 選項默認只有Application

Property.Settings 的讀取順序

  • 在 Build 的時候會先寫入預設初始設定值到程式中
  • 程式開啟時:
  • userSetting
    • 到系統使用者數據中尋找是否有該程式的使用者設定數據,讀取出來使用
    • 如果系統使用者數據中沒有設定資料,則讀取對應 .config 檔案中的設定
    • 如果沒有找到 .config 則是用默認預設值
  • applicationSetting
    • 讀取對應 .config 檔案中的設定
    • 沒有 .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>
  • 第一步 : 移除或改名 .config
Console.WriteLine(Properties.Settings.Default.UserKey1);
Console.WriteLine(Properties.Settings.Default.ApplicationKey1);

Value for UserKey1 (輸出預設值)
ApplicationValue1

  • 第二步 : 還原並修改 [app.exe].config
    <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

  • 第三步 : 修改但不Save()
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設定的資料)


appSetting and connectionStrings

接下來再來看看和結構.

  • 是以key/value名稱存放。
  • 用name/connectionString方式存放。
  • 它們不需要設定。
  • 這兩個結構一定都是跟著應用程式組態檔(.config)跑。

需要加入參考 System.Configuration.dll
引用 using System.configuration;
web application 需要額外 using System.Web.Configuration;

1. appSetting

//讀取
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);

2. connectionStrings

//讀取
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);

參考文章:


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言