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

2012102609:06
出處: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檔案,而產生錯誤的機率,

大家也可以依照自己實際上的需求來修改安裝過程所需要的動作,

如果有任何問題歡迎大家多多提出來! ^_^