2010-09-03 135 views
1

我正在尋找一個.net應用程序的安裝程序,它需要運行一些其他MSI。由於限制你一次只能運行一個MSI(說實話,它是1995年嗎?),而且我希望提供可配置的MSI來運行,我不能只將MSI推入引導程序中,因爲這似乎是推薦的實踐。我發現一個similar question,但沒有迴應的快樂。在安裝過程中運行MSI

作爲替代方案是否存在基於.net的安裝程序框架,可用於定製安裝過程?我熟悉IzPack,InstallJammerNSIS,但所有這些都使用非.NET語言,並且這對於有點害怕其他技術的.net商店也是如此。

回答

3

如果您使用他們的用戶界面或簡單地使用WiX風格的用戶界面,則WiX解決了這個問題。

如果您想要更豐富的UI體驗,您需要編寫自定義引導程序。過去我通過編寫一個客戶引導程序解決了這個問題,該引導程序爲用戶提供了一個統一的用戶界面,並使安裝看起來像一個單獨的包,實際上安裝是按順序運行的MSI文件的集合。

下面是我所做的一般要點:

  • 引導程序是.NET託管代碼。優點:更容易編寫。缺點:某些系統沒有.NET,我必須爲我的託管引導程序安裝一個小型非託管引導程序,這個引導程序先部署.NET,然後啓動託管引導程序。
  • 發現MSI文件(app.config工程...我的應用程序更復雜)。
  • 的受管MSI API來讀取每個MSI文件功能列表
  • 內置一個單一的「特徵選擇」嚮導創建頂級功能爲每個MSI文件,然後填充子功能,從每個讀取.NET的WinForms頁MSI文件。
  • 根據功能選擇和其他選項(卸載,修復,升級等)創建MSI命令行。
  • 爲「套件」安裝程序創建了卸載註冊表項,並隱藏了MSI特定的卸載密鑰,以便添加/刪除程序/程序&功能中只有一個條目。

魔鬼的細節,但它的工作,它運作良好!

編輯2010/9/3更多的音符:

這裏有一些事情,如果你採取這種方法來考慮:

  • 什麼是維護模式的經驗嗎?您可能需要將系統引導程序緩存到系統中,以便在從ARP啓動時打開它。
  • 如何升級和卸載?你允許升級一些微星而不是其他微星嗎?
  • 如何檢測升級與維護模式?幾乎你必須掃描所有的MSI,如果這些MSI(認爲「功能」)中的任何一個已過期,那麼你將作爲升級運行,而不是維護。
  • 考慮部分功能增加...您是否支持只安裝部分MSI?在這種情況下,可以升級一些並重新安裝其他場景。
  • 您可能最終會爲整體套件介紹套件版本的概念。不要欺騙自己......這只是一個人/市場版本......只有MSI的問題的版本,只有這些版本才能用於確定安裝/修復/升級等。

基本上,在編寫安裝(無論是單個MSI還是組合套件安裝)時,請確保爲整個軟件生命週期佈置了所有用例。以短視的方式編寫安裝程序非常容易,然後在v2發佈時發現自己被繪成不愉快的角落。

祝你好運;)

+0

這似乎是一個很好的方式去了解它。有關創建套件註冊表項的任何提示? – stimms 2010-09-03 17:19:23

+0

添加/刪除程序主要由HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall中的條目構建。看看那裏的一些條目,以瞭解它的結構。您可以通過Google獲取有關如何隱藏其他應用的信息......有幾種技術。 我已經更新了我的答案,以包含一些其他注意事項,如果採取此方法,您將需要考慮。嚴重敲門的學校。 – 2010-09-03 19:31:11

+0

您的回覆確實非常非常有幫助。感謝您抽出寶貴的時間。 – stimms 2010-09-03 20:51:53

0

我使用WiX創建MSI,然後使用非常小的NSIS腳本將它們打包到.exe中。我已經與微軟的項目交流過了,他們自己使用了很多。如果您發現XML令人生畏,那麼有些工具可以幫助您使用它。

即使您堅持讓MSI成爲您的工作方式,我仍會推薦NSIS作爲.exe。腳本通常很小。