2013年9月11日 星期三

[轉貼] 使用Setup Project,在安裝過程中修改Config設定

出處:http://www.dotblogs.com.tw/kirkchen/archive/2010/06/05/15650.aspx


前言


在發布軟體時,我們通常會將軟體打包為一個安裝檔來方便使用者安裝,
而使用者只需要根據安裝的步驟一步步地輸入該設定的資訊,
就可以非常輕鬆的部屬軟體,那如果希望在安裝時同時讓使用者輸入資料,
並同時將結果更新至config檔之中,又該怎麼做呢?
接下來將在文章中做一個示範說明

實際演練


首先建立一個Windows From專案,並配置簡單的控制項如下,
1 
再新增一個app.config檔案,並配置三個appsettings
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="Sample.Config1" value="This is config 1"/>
    <add key="Sample.Config2" value="This is config 2"/>
    <add key="Sample.Config3" value="This is config 3"/>
  </appSettings>
</configuration>

當按下按鈕時,會分別顯示各AppSettings的值,如
2
接下來我們來開始為這個Windows Form建立一個Setup Project,
並且在安裝過程中,加入輸入的欄位,來讓使用者輸入自己想要的Config設定,
選擇Add New Project,並選擇Setup Project
3
滑鼠右鍵選擇Application Folder,新增Project Output,
4
選擇之前建立的Windows Form專案
5
在SampleSetup上按滑鼠右鍵,選擇View => User Interface,加入自訂輸入畫面
6
點選Start,選擇Add Dialog
7
因為我們只有三個Config要設定,所以在這邊我們選擇Textboxes (B)
8
將Textboxes (B) 移至圖中的位置,並根據自己需求修改Textboxes (B) 屬性如下
9
10
在這邊我們將第四個欄位的Visiable設為false,因為我們只有三個需要修改的地方,
接下來滑鼠右鍵點選Setup Project,選擇View => Custom Actions
11
在Install資料夾按滑鼠右鍵,選擇Add Custom Action
12
選擇Application Folder裡面,我們專案的Output,
13
接下來設定Primary Output的屬性如下
14
可以看到我們主要修改的是CustomActionData欄位,
這邊的格式為/name1=[value1] /name2=[value2],每組資料之間有一個空格
name指的是待會要讀取的參數名稱,而value則是剛剛Textboxes (B)的各欄位名稱
接下來我們必須要在Windows Form專案中新增一個Installer Class,
來進行我們讀取使用者輸入的參數,並修改Config的動作
新增Installer
15
接下來我們會覆寫Installer的Install方法,加入修改config的片段
    [RunInstaller(true)]
    public partial class InstallerHelper : Installer
    {
        public InstallerHelper()
        {
            InitializeComponent();
        }

        public override void Install(System.Collections.IDictionary stateSaver)
        {
            base.Install(stateSaver);

            try
            {                
                var map = new ExeConfigurationFileMap();

                //Get app.config path
                map.ExeConfigFilename = Context.Parameters["assemblypath"] + ".config";

                //Get Config and AppSettings
                var config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
                var appSettings = config.AppSettings;

                //Get input value from setup project
                var configValueList = new List<string>() { Context.Parameters["Config1"], 
                                                           Context.Parameters["Config2"], 
                                                           Context.Parameters["Config3"] };

                //assign input value to appSettings
                for (int i = 1; i <= 3; i++)
                {
                    appSettings.Settings["Sample.Config" + i].Value = configValueList[i - 1];
                }

                //save app.config
                config.Save();
            }
            catch (Exception e)
            {
                string s = e.Message;
            }
        }       
    }
到這邊我們就完成了在Install中修改Config的設定,我們可以Build Setup Project,
並點選我們建立好的Install檔案,可以看到在中間也確實出現了輸入畫面
16
安裝完後,我們執行安裝好的程式,點選第一個按鈕
17
我們可以看到有正確的依照安裝時輸入的設定顯示,大功告成!

結語


方便的安裝方式,不僅可以讓使用者方便使用,
也可以降低使用者直接修改Config檔案,而產生錯誤的機率,
大家也可以依照自己實際上的需求來修改安裝過程所需要的動作,
如果有任何問題歡迎大家多多提出來! ^_^

沒有留言:

張貼留言