最近由於項目部署時需要更靈活的控制程序安裝的流程以及自定義安裝行為,特意研究了一下VS程序打包,把解決辦法和大家分享一下。
以VS2010為例:
這是一個已經設置好最基本的Visual Studio Installer解決方案界面,以此生成的安裝包,將會是一個最基本的安裝功能。程序打包的詳細教程網上很多,就不再贅述。
由於我的項目部署時,需要同時修改用戶的注冊表,而且是需要根據用戶自己選的安裝路徑去修改注冊表。於是VS的打包程序自帶的加入注冊表功能,並不適用於我的情況,因為這樣注冊表導入進去之後就沒法改了,不能把安裝路徑再傳到注冊表裡面去。
於是就需要我們自定義代碼,通過安裝程序的事件來控制安裝流程。
解決方案->添加->新建項目->類庫,命名為ExtensionLibrary,在項目ExtensionLibrary下面,刪除Class1.cs,添加->新建項目->安裝程序類(名稱為InstallerDemo.cs),打開InstallerDemo.cs,這個class InstallerTest繼承自System.Configuration.Install.Installer,裡面就一個構造函數。現在安裝程序不能完成的功能,都可以在這個類寫代碼來自己實現。
舉例:在構造函數裡面添上this.AfterInstall+= new InstallEventHandler(InstallerDemo_AfterInstall),實現方法InstallerDemo_AfterInstall(object sender, InstallEventArgs e),就可以完成程序在安裝之後要做的事情了,Installer主要要用到的事件不外乎這幾個:BeforeInstall,AfterInstall,AfterRollback,AfterUninstall,BeforeRollback,BeforeUninstall,很明顯的意思。
現在我需要在安裝完成之後,根據用戶的安裝路徑,向系統注冊表添加一些值:
public InstallerDemo() { InitializeComponent(); this.AfterInstall += new InstallEventHandler(InstallerDemo_AfterInstall); } private void InstallerDemo_AfterInstall(object sender, InstallEventArgs e) { string path = this.Context.Parameters["targetdir"];//獲取用戶設定的安裝目標路徑, 注意,需要在Setup項目裡面自定義操作的屬性欄裡面的CustomActionData添加上/targetdir="[TARGETDIR]\" string [] commands=new string[4]; commands[0] ="/c"+ " reg add HKCR\\renke /f /ve /d \"URL:HyperText Transfer Protocol with Privacy\" "; commands[1] ="/c"+ " reg add HKCR\\renke /f /v \"URL Protocol\" /d \"\" "; commands[2] ="/c"+ " reg add HKCR\\renke\\shell /f /ve /d \"open\" "; commands[3] ="/c"+ " reg add HKCR\\renke\\shell\\open\\command /f /ve /d \"\\\""+ path + "\\" + "Gyn5tDataAnalyze.exe\\\" \\\"%1\\\"\" "; foreach (var command in commands) { Process p = new Process { StartInfo = { FileName = "cmd.exe", Arguments = command, UseShellExecute = false, RedirectStandardInput = true, RedirectStandardOutput = true, CreateNoWindow = true } }; p.Start(); p.StandardInput.WriteLine("exit"); p.Close(); } }
完成了上面的自定義代碼的InstallerDemo_AfterInstall方法,還是不夠的,只是這樣的話在安裝之後是不會執行InstallerDemo_BeforeInstall中的代碼的。還要用到“自定義操作編輯器”。項目SetupDemo->添加->項目輸出->選擇ExtensionLibrary後確定,你會發現,在項目SetupDemo下面多了一項“主輸出來自ExtensionLibrary(活動)”的字樣。
好,到正題了,來到“自定義操作”處,可以看到四個子項:安裝,提交,回滾,卸載。在安裝上面點擊右鍵->添加自定義操作->選擇“主輸出來自ExtensionLibrary(活動)”。這樣,重新生成後,安裝之前就會執行InstallerDemo_BeforeInstall代碼了。
另外,要取得用戶的安裝目錄還需要注意,在自定義操作->安裝->“主輸出來自ExtensionLibrary(活動)”上面右鍵屬性,在CustomActionData中填入/targetdir="[TARGETDIR]\", 然後在類InstallerDemo中用這句話this.Context.Parameters["targetdir"] 就可以取得安裝的目錄。
這樣直接在安裝之後調用控制台來執行添加注冊表的操作,同時也能夠根據用戶選擇不同的安裝路徑來配置注冊表。
使用這種方法,可以在VS Installer 自帶功能無法滿足項目需求的情況下,更靈活的處理和應對安裝包所需要的做到的各種事情。
後面有時間將會介紹怎麼用BS系統裡面調用本地CS程序並且向CS系統傳遞參數。