要設計安裝程序,可以在 Visual Studion 中建立一個安裝專案,將應用程式專案打包成一個安裝檔後,再進行安裝。 另外也可以在應用程式專案中,自行加入一個安裝類別,再透過安裝工具 InstallUtil.exe ,將該組件安裝至系統。
建立標準安裝檔
如何建立標準安裝檔
使用.NET提供的安裝專案,可以輕鬆快速的建立Setup程式。底下示範如何建立安裝專案:
1.建立一個【應用程式專案】,取名為TestAP。(假設這個專案就是即將被做成安裝檔的專案)
2.加入一個【安裝專案】,取名為Setup1。
你可以在【安裝專案】的右鍵選單中檢視專案的檔案系統,檔案系統中預設會有下列三個項目:
- 使用者的桌面:用來設定要在使用者的桌面建立哪些檔案,通常是捷徑。
- 使用者的程式功能表:用來設定要在使用者的程式功能表建立哪些檔案,通常也是捷徑。
- 應用程式資料夾:用來設定應用程式安裝目錄中的內容。
你也可以點選檔案系統根目錄上的右鍵選單,加入其他特殊資料夾
3.設定安裝專案的屬性。
上圖中,紅色框線的欄位是比較常用的,它們會出現在下圖的畫面中。
另外值的一提的,在應用程式資料夾的屬性有個 DefaultLocation ,就是參考專案屬性中的 [Manufacturer] 和 [ProductName] 設定值。
4.將【應用程式專案】加入到【安裝專案】中
在方案總管中,點選安裝專案,在右鍵選單中,點選「加入專案輸出」。等詢問視窗出現後,在專案選項中,選擇你要安裝的專案。
這個步驟完成後,你可以看到以下的內容,它表示我們要將【應用程式專案】產生的執行檔,安裝到指定的目錄中。 所以,如果你同時有其他專案的檔案要打包進來,就可以重複這個步驟。 或者你有特定的檔案要一併安裝進去,也可以在這裡做設定。
5.建置【安裝專案】
做完以下步驟,原則上就可以開始建置Setup1專案,以產生安裝檔。底下是一些額外功能,也可以參考參考。
如何建立一個捷徑
- 點選【應用程式資料夾】,點選【主要輸出從XXX】,在右鍵選單中,建立一個捷徑,取名為TestApp。
如何讓安裝程式自動在桌面建立捷徑
- 將上一步驟所建立的捷徑,拖拉至【使用者的桌面】。
如何讓安裝程式自動在開始功能表中建立捷徑
- 在Setup1專案的檔案系統功能中,點選【目標電腦上的檔案系統】,在右鍵選單中,點選【加入特殊資料夾】,然後選擇【使用者的開始功能表(User's Start Menu)】。
- 重複步驟5,再建一個捷徑,並將建立的捷徑拖拉至【使用者的開始功能表】。
如何設定捷徑的圖示
- 先在【應用程式資料夾中】,加入圖示檔案
- 點選【使用者的桌面】中的那個捷徑,在其屬性視窗中的Icon欄位,找到上一步驟的檔案。
- 這樣子,安裝完之後,桌面就會有一個包含icon的捷徑。
- 同樣的,若希望【開始功能表】中的捷徑也有圖示,照著做就可以。
建立客製化安裝檔
.NET 提供了 System.Configuration.Install.Installer 這個類別,用以建立自訂安裝程式。使用這個類別,必須遵守下列幾個步驟:
- 建立一個衍生類別,繼承自 Installer 類別。
- 在這個類別上頭加上 RunInstallerAttribute 屬性,並將值設為 true。 這個設定值是用來告訴系統,當組件安裝時,是否要叫用 Visual Studio Custom Action Installer 或 Installutil.exe 。
- 視實際需求,覆寫 Install 、 Commit 、 Rollback 、 Uninstall 等方法,並撰寫程式碼。
下面例子將示範如何製作一個安裝檔,且符合以下功能:
- 1.在安裝過程中,加入一個對話視窗,要求使用者輸入公司名稱及電話,並將這些資訊更新到應用程式的組態檔,以便應用程式執行時可讀取使用。
- 2.在安裝進行時,在安裝目錄中產生一個檔案,檔名為 Log.txt。
- 3.在安裝完成時,建立一個檔案 C:\Commit.txt。
- 4.在安裝失敗時,建立一個檔案 C:\Rollback.txt。
- 5.在安裝移除時,建立一個檔案 C:\Uninstall.txt,並將 Commit.txt、Rollback.txt 刪除。
1.建立一個【應用程式專案】,取名為TestAP,並加入一個【應用程式組態檔】,組態檔內容如下。(假設這個就是要被做成安裝檔的專案)
<?xml version="1.0" encoding="utf-8" ?> <configuration> <appSettings> <add key="CopName" value=""/> <add key="CopTel" value=""/> </appSettings> </configuration>
2 ~ 4 同建立標準安裝檔。
5.開啟【使用者介面編輯器】,點選【開始】,在右鍵選單中,點選【加入對話方塊】。等詢問視窗出現後,選擇【文字方塊(A)】,再按確定。(你可依實際需求,加入你要的對話方塊)
6.將文字方塊(A),拖拉至【確認安裝】之前。
7.點選【文字方塊(A)】,打開屬性視窗。
屬性視窗中的欄位設定,分別對應到右圖中這個安裝過程中的新增對話視窗,你可以在此做一些文字設定,如 BannerText、BodyText 等等.
另外文字方塊(A),預設有4個InputBox,對應到此處的 Edit1~Edit4 四個項目,你可以在此設定輸入方塊前的標題文字,若用不到的輸入方塊,可將其 Visible 屬性設成 False 即可。
底下步驟開始客製化程式
8.在TestAP專案中加入一個【安裝程式類別】,取名 myInstaller。
9.切換到安裝程式類別的檢視程式碼,配合案例需求,我們必須在專案中加入 System.Configulation 參考,以進行組態檔變更,並且引用以下命名空間:
using System.IO; using System.Configuration;
10.開啟Setup1專案的【自訂動作編輯器】
11.在自訂動作編輯器的安裝項目中,利用右鍵選單【加入自訂動作】,完成對話視窗的設定,如下圖所示。
12.點選【安裝】項目底下的自訂動作,打開屬性設定視窗,在 CustomActionData 欄位輸入 /para1="[EDITA1]" /para1="[EDITA2]"
這裡比較要特別說明的是 CustomActionData,這是用來對應到使用者所輸入的資料,以便讓程式碼讀取
配合文字方塊(A)的樣式,所以可以設定4組參數,每一組使用一個空白隔開
/para1="[EDITA1]" /para1="[EDITA2] /para3="[EDITA2] /para4="[EDITA2]
para1~para4 是程式中,用來讀取參數的key值,可自行設定,只要程式碼使用一致即可。
EDITA1~EDITA2 是步驟7中 Edit?Property 欄位的值,也可任意設定,只要二邊一致即可。
如上設定,使用 Context.Parameters["para1"] 就可取得 EDITA1 這個TextBox的輸入資料。
13.修改 myInstaller 類別,內容如下
using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Configuration.Install; using System.IO; using System.Configuration; namespace TestAP { [RunInstaller(true)] public partial class myInstaller : Installer { public myInstaller() { InitializeComponent(); } //覆寫原先的Install()方法 public override void Install(IDictionary savedState) { base.Install(savedState); //取得安裝路徑 string InstallPath = Path.GetDirectoryName(Context.Parameters["assemblypath"]); //建立Log檔 StreamWriter log = System.IO.File.CreateText(Path.Combine(InstallPath, "Log.txt")); //在安裝目錄中,建立一個Log檔 //for debug foreach (DictionaryEntry de in Context.Parameters) { log.WriteLine("key:{0} value:{1}", de.Key, de.Value); } //開啟應用程式設定檔 var exeConfigurationFileMap = new ExeConfigurationFileMap(); exeConfigurationFileMap.ExeConfigFilename = Context.Parameters["assemblypath"] + ".config"; var config = ConfigurationManager.OpenMappedExeConfiguration(exeConfigurationFileMap, ConfigurationUserLevel.None); //更新設定檔變數的值 config.AppSettings.Settings["CopName"].Value = Context.Parameters["COPNAME"]; //讀取使用者輸入的公司名稱 config.AppSettings.Settings["CopTel"].Value = Context.Parameters["COPTEL"]; //讀取使用者輸入的公司電話 //儲存 config.Save(); log.Close(); //測試 <a target='_blank' href='http://msdn.microsoft.com/zh-tw/library/system.configuration.install.installer.rollback'>Rollback</a> 區段 //throw new Exception("Rollback test"); // 有時候安裝過程,也常會同時註冊機碼 Registry.CurrentUser.CreateSubKey(@"Software\CustomKey"); } //覆寫Uninstall(),刪除Install時建立的Log檔 public override void Uninstall(IDictionary savedState) { base.Uninstall(savedState); //..do anything if necessary if (File.Exists(@"C:\Rollback.txt")) File.Delete(@"C:\Rollback.txt"); if (File.Exists(@"C:\Commit.txt")) File.Delete(@"C:\Commit.txt"); System.IO.File.CreateText(@"C:\Uninstall.txt"); } //覆寫Rollback()方法,刪除Install時建立的Log檔 public override void Rollback(IDictionary savedState) { base.Rollback(savedState); //..do anything if necessary System.IO.File.CreateText(@"C:\Rollback.txt"); } //覆寫Commit()方法 public override void Commit(IDictionary savedState) { base.Commit(savedState); //..do anything if necessary System.IO.File.CreateText(@"C:\Commit.txt"); } } }
14.分別在自訂動作功能裡的【認可】【復原】【解除安裝】項目底下,重複步驟10,
我們在步驟10的程式碼中,覆寫了Commit、Rollback、Uninstall方法,必須在此加入這些自訂動作,程式才會進入執行。
=>設定到此大功告成。 執行 setup,是否出現要求輸入公司資訊的視窗。
檢查設定檔,公司資訊是否已變更。
檢查安裝目錄,檔案Log.txt是否已建立。
檢查 C:\,檔案Commin.txt是否已建立。
執行 Uninstall,檢查檔案 Commin.txt 是否有被刪除。
啟動安裝程式
上面這個例子,我們在應用程式專案中加入了一個繼承自 Installer 的安裝類別,同時也建立一個安裝專案,以便設計一個自訂的安裝畫面,讀取使用者的公司名稱及電話。 若透過安裝專案進行安裝,安裝過程會將使用者輸入的資料帶入 Install 方法中,如果使用 InstallUtil.exe 工具安裝,依然會執行 Install 方法,就不會帶入使用者輸入的資料。 底下示範的是,如何使用 InstallUtil.exe 工具進行安裝。
在命令列中使用 InstallUtil.exe 工具安裝
InstallUtil.exe 這個工具會對應用程式中的組件進行反射(reflection),找出所有繼承 Installer 且具有 RunInstaller(true) 屬性的類別,然後執行其 Install 方法。
//安裝 InstallUtil myAssembly.exe //移除安裝 InstallUtil /u myAssembly.exe
透過程式碼啟動安裝
若要以程式方式啟動安裝程式,可以使用 AssemblyInstaller 或 ComponentInstaller 類別。使用這二個類別時必須執行下列兩個步驟:
- 建立其物件的執行個體。
- 呼叫安裝程式中想要執行的方法
// 建立一個安裝類別的執行個體 AssemblyInstaller assInstaller = new AssemblyInstaller("Practice.exe", null); // 使用新安裝內容 assInstaller.UseNewContext = true; // 以下視需求,執行必要的方法: // 執行 Install assInstaller.Install(actions); // 執行 Commit assInstaller.Commit(actions); // 執行 Uninstall assInstaller.Uninstall(actions); // 執行 Rollback assInstaller.Rollback(actions);
沒有留言:
張貼留言