雖然 Windows Setup Project 安裝專案很好用,也可以自訂使用者介面,但限制頗多,只要自訂的使用者介面多一些條件就沒辦法客製化了,所以我們打算改用 NSIS 進行安裝過程的介面自訂,最後再將透過 UI 介面取得的參數傳入 Installer 類別中,並利用 C# 撰寫的程式碼幫我們完成 Post-Install 的動作執行,例如安裝 IIS 站台、建立資料庫、建立使用者或群組、... 等。
首先我是先看到 Installer 類別中的 Install 方法可以傳入一個 IDictionary 的資料:
最近研究了 Msiexec.exe 與 InstallUtil.exe 工具,試圖想在 Post-Install 的過程可以傳入準備好的自訂的參數到 Installer 類別,雖然 Installer 類別中的 Install 方法可以傳入一個 IDictionary 的資料,不過我就是從 Msiexec.exe 與 InstallUtil.exe 工具中找不到有任何方法可以傳入自訂的參數集合。
最後才發現原來有個 AssemblyInstaller 類別可以用,透過這個類別來包裹 InstallUtil.exe 工具進行安裝動作,就可以輕易的傳入任意參數到安裝過程的各種 method 中。
但才開心沒多久,這條路又被堵住了,透過 Reflector 查看 Install 方法才發現,原來傳入的 savedState 參數在傳入的時候就會立即被一行 new Hashtable(); 給複寫掉,所以傳入任何參數也都是沒用的。
不止 Install 方法不能傳,Commit, Rollback, Uninstall 方法也都會被複寫掉,所以這條路是不通的。
而且由此可知,在 Installer 類別內的 savedState 僅用於安裝過程中紀錄各種安裝狀態用,並無法用來做其他用途,例如當成傳入參數的管道!
那好吧,該試的方法 "應該" 都試了吧,使用 Windows / .NET 內建的安裝工具我覺得已經無解了,如果有人有方法,煩請告知!
目前我只能向外發展,找尋 NSIS 的 Plug-ins 或 InnoSetup 等不同的安裝部署解決方案,讓我能夠自訂更細的安裝過程。
我個人是還在期待 WiX 的降臨,因為 WiX 3.0 的 Beta 版即將結束,馬上就要 RTM 了,且未來會整合進 Visual Studio 2010,成為新的預設安裝專案類型,到時應該會有更完善的開發介面,而不用再辛苦的撰寫 XML 定義檔了吧。
相關連結