[window form]於安裝過程中修改app.config內容

[window form]於安裝過程中修改app.config內容

紀錄一下過程

問題描述

Window form採用SQLite + Entity framework;因為客戶在安裝時,可能會修改安裝路徑,安裝時需要修改app.config中的連線字串。

目的

可以正常運作資料庫。

解決方法

app.cofing內容,如下要修改connectstring的內容。


<?xml version="1.0" encoding="utf-8"?>
<configuration>  
  <connectionStrings>
    <add name="NewMediaEntities" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SQLite;provider connection string=&quot;data source=H:\開發區\2010Projects\PCD\NewPCD\dbfile\NewMedia.db3&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>
  <system.data>
    <DbProviderFactories>
      <remove invariant="System.Data.SQLite"/>
      <add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".Net Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite, Version=1.0.66.1, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
    </DbProviderFactories>
  </system.data>

</configuration>

法一 利用安裝專案的自訂動作

1. 於安裝專案上選取【檢視】【自訂動作】

1

2. 加入自訂動作

2

3. 選擇「應用程式資料夾」,加入主要輸出後按「確定」

3

4. 在自訂動作的屬性頁籤的CustomActionData,輸入下列文字(自訂動作)

/targetdir="[TARGETDIR]\"

4

5. 於原來的window form專案加入「安裝程式類別」

5

6. 修改安裝程式類別的Install方法如下,重新將window form及安裝專案編譯,完成修改!


public override void Install(System.Collections.IDictionary stateSaver)
        {
            base.Install(stateSaver);
            //取得安裝時的路徑
            string targetDirectory = Context.Parameters["targetdir"];
            //串接出執行檔的路徑
            string exePath = string.Format("{0}NewPCD.exe", targetDirectory);
            try
            {
                FileInfo fi = new FileInfo(exePath);
                string filepath = fi.FullName.Replace(fi.Name, string.Empty);               
                Configuration config = ConfigurationManager.OpenExeConfiguration(exePath);                
                config.ConnectionStrings.ConnectionStrings["NewMediaEntities"].ConnectionString = 
                    "metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SQLite;provider connection string=\"data source="+filepath+"NewMedia.db3\"";
                config.Save();                
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
            }
        }

法二 利用組件相關資訊

1. 於原來的window form專案加入「安裝程式類別」

clip_image007

2. 修改安裝程式類別的OnAfterInstall方法如下,重新將window form及安裝專案編譯,完成修改!


protected override void OnAfterInstall(IDictionary savedState)
        {
            base.OnAfterInstall(savedState);
            ExeConfigurationFileMap map = new ExeConfigurationFileMap();
            // 讀取config檔的位置
            string configFile = string.Concat(Assembly.GetExecutingAssembly().Location,
           ".config");
            FileInfo fi = new FileInfo(configFile);
            string filefolder = fi.FullName.Replace(fi.Name, string.Empty);                        
            map.ExeConfigFilename = configFile;
            //藉由組件的mapping讀取config
            System.Configuration.Configuration config = System.Configuration.ConfigurationManager
            .OpenMappedExeConfiguration
            (map, System.Configuration.ConfigurationUserLevel.None);
            try
            {                
                config.ConnectionStrings.ConnectionStrings["NewMediaEntities"].ConnectionString =
                "metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SQLite;provider connection string=\"data source=" + filefolder + "NewMedia.db3\"";
                config.Save();
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
            }
        }

參考資料

[Window Form]修改安裝檔路徑到App.Config

Adding connection String During Installation

ExeConfigurationFileMap 類別

Configuration 類別