The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

如何將自訂參數傳入 Installer 類別的 Install 方法

雖然 Windows Setup Project 安裝專案很好用,也可以自訂使用者介面,但限制頗多,只要自訂的使用者介面多一些條件就沒辦法客製化了,所以我們打算改用 NSIS 進行安裝過程的介面自訂,最後再將透過 UI 介面取得的參數傳入 Installer 類別中,並利用 C# 撰寫的程式碼幫我們完成 Post-Install 的動作執行,例如安裝 IIS 站台、建立資料庫、建立使用者或群組、... 等。

首先我是先看到 Installer 類別中的 Install 方法可以傳入一個 IDictionary 的資料:

Installer.Install 方法

最近研究了 Msiexec.exeInstallUtil.exe 工具,試圖想在 Post-Install 的過程可以傳入準備好的自訂的參數到 Installer 類別,雖然 Installer 類別中的 Install 方法可以傳入一個 IDictionary 的資料,不過我就是從 Msiexec.exeInstallUtil.exe 工具中找不到有任何方法可以傳入自訂的參數集合。

最後才發現原來有個 AssemblyInstaller 類別可以用,透過這個類別來包裹 InstallUtil.exe 工具進行安裝動作,就可以輕易的傳入任意參數到安裝過程的各種 method 中。

但才開心沒多久,這條路又被堵住了,透過 Reflector 查看 Install 方法才發現,原來傳入的 savedState 參數在傳入的時候就會立即被一行 new Hashtable(); 給複寫掉,所以傳入任何參數也都是沒用的。

AssemblyInstaller.Install method: 傳入的 savedState 被蓋掉了 

不止 Install 方法不能傳,Commit, Rollback, Uninstall 方法也都會被複寫掉,所以這條路是不通的。

而且由此可知,在 Installer 類別內的 savedState 僅用於安裝過程中紀錄各種安裝狀態用,並無法用來做其他用途,例如當成傳入參數的管道!

那好吧,該試的方法 "應該" 都試了吧,使用 Windows / .NET 內建的安裝工具我覺得已經無解了,如果有人有方法,煩請告知!

目前我只能向外發展,找尋 NSISPlug-insInnoSetup 等不同的安裝部署解決方案,讓我能夠自訂更細的安裝過程。

我個人是還在期待 WiX 的降臨,因為 WiX 3.0 的 Beta 版即將結束,馬上就要 RTM 了,且未來會整合進 Visual Studio 2010,成為新的預設安裝專案類型,到時應該會有更完善的開發介面,而不用再辛苦的撰寫 XML 定義檔了吧。

相關連結