2013-02-03 30 views
0

我有一個產品包含幾個功能(A,B,C),它們都共享一個共同的Windows服務組件。 問題在於存在一個最終情況:如果只安裝了一個特定功能(功能C)和一個「遺留模式」標誌(某些保存在註冊表中的屬性),那麼這個Windows服務組件應該未安裝或其啓動類型應從「自動」更改爲「禁用」。我更喜歡禁用啓動類型解決方案的「未安裝」解決方案。由幾個功能共享組件的條件安裝

在其他所有情況下:除了此功能(C)之外還安裝了其他功能(A,B),或未設置'legacy-mode'標誌時,應安裝windows-service組件並啓動類型應設置爲「自動」。
如果產品已重新配置,應重新評估條件並針對兩種情況採取適當的措施。

的問題是,它是無法使用的功能在窗口服務組件的條件安裝態,因爲這兩個功能安裝狀態和組件的狀態在同一CostFinalize作用來評價(見:http://www.joyofsetup.com/2008/04/09/feature-states-in-component-conditions/) 此外,使用自定義操作中刪除組件的方法不起作用,因爲非傳遞組件不能從現有功能中刪除,除非這是主要升級(請參閱http://blogs.msdn.com/b/heaths/archive/2010/02/15/test-your-conditions.aspx

我可以將組件分離爲不同的功能,並嘗試編寫自定義操作,該操作基於CostFinalize操作之後的其他功能的安裝狀態設置此功能的安裝狀態,但是該接口需要compli爲不同場景安裝邏輯(安裝,重新配置,回滾,卸載)並使其更容易出錯。

你會建議什麼?

+0

如果您的評論解決了您的問題,您應該將其作爲回答發佈並接受,以便其他人在遇到類似問題時可以更輕鬆地找到解決方案。 – Netfangled

+0

好吧,我現在就做到了。謝謝。 –

回答

0

最終我創建了一個子功能,其中只包含了windows-service組件,並且我使用兩個MsiSetFeatureState自定義操作來控制其安裝狀態,這兩個MsiSetFeatureState自定義操作將在CostFinalize之後進行調度 - 一個用於將狀態設置爲不存在C被安裝或重新配置,'legacy-mode'標誌被設置,另一個被設置爲install-local,以便安裝或重新配置特徵C並且未設置'legacy-mode'標誌。窗口服務組件仍然在功能A,功能B和功能C的這個子功能之間共享。這似乎工作得很好!