上回提過透過程式修改config檔設定值,再分享一個私房小技巧。

當我們使用Visual Studio對程式偵錯時,VS在編譯(Build)時會一併將App.Config的內容覆寫到/debug/bin/yourAppName.exe.config及/debug/bin/'yourAppName.vshost.exe.Config。程式執行時,對config檔的修改其實是寫到yourAppName.vshost.exe.Config裡。當程式執行結束,yourAppName.vshost.exe.Config的內容會再被App.Config所覆蓋。換句話說,VS偵錯程式時對Config所做的修改會在程式結束後化為烏有,那還測個屁?? (這讓我一直聯想到月亮上那棵吳剛砍了幾千年還砍不斷的桂樹)

有些人建議改用自訂的config來保存設定值,但如此就無法借用現成方法更新設定,讓人有些不甘心。另一種做法是將bin目錄下的檔案Copy到其他目錄下再執行,但這又衍生出"部署"需求,破壞"改完程式按一下就馬上Debug"的流暢性。

於是我土法鍊鋼加入以下程式: 在程式結束時,先偵測是否為偵錯模式? 若是,則將Config檔案內容回寫App.Config,如此就不用再擔心程式修改結果被覆寫囉!

排版顯示純文字
using System;
using System.Windows.Forms;
using System.Configuration;
using System.IO;
 
namespace WF
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_FormClosed(object sender, 
            FormClosedEventArgs e)
        {
            System.Configuration.Configuration conf =
                ConfigurationManager.OpenExeConfiguration(
                    ConfigurationUserLevel.None);
            conf.AppSettings.Settings["LastTime"].Value =
                DateTime.Now.ToString("HH:mm:ss");
            conf.Save(ConfigurationSaveMode.Modified);
            try
            {
                //Debug Mode時回寫app.config
                if (System.Diagnostics.Debugger.IsAttached)
                    File.Copy(conf.FilePath,
                    "..\\..\\app.config", true);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            System.Configuration.Configuration conf =
                ConfigurationManager.OpenExeConfiguration(
                    ConfigurationUserLevel.None);
            this.Text = "LastTime => " + 
                conf.AppSettings.Settings["LastTime"].Value;
        }
    }
}

Comments

Be the first to post a comment

Post a comment