[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="data source=H:\開發區\2010Projects\PCD\NewPCD\dbfile\NewMedia.db3"" 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. 於安裝專案上選取【檢視】【自訂動作】
2. 加入自訂動作
3. 選擇「應用程式資料夾」,加入主要輸出後按「確定」
4. 在自訂動作的屬性頁籤的CustomActionData,輸入下列文字(自訂動作)
/targetdir="[TARGETDIR]\"
5. 於原來的window form專案加入「安裝程式類別」
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專案加入「安裝程式類別」
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