0

私はいくつかの機能 (A、B、C) で構成される製品を持っており、そのすべてが共通の Windows サービス コンポーネントを共有しています。キャッチは、最終的なケースがあることです:「レガシーモード」フラグ(レジストリに保存されるいくつかのプロパティ)を使用して、特定の機能(機能C)が1つだけインストールされている場合、このwindows-serviceコンポーネントはインストールされるべきではありませんインストールするか、スタートアップの種類を「自動」から「無効」に変更する必要があります。無効なスタートアップ タイプのソリューションよりも、「インストールされていない」ソリューションをお勧めします。

他のすべての場合: この機能 (C) 以外に他の機能 (A、B) がインストールされている場合、または「レガシー モード」フラグが設定されていない場合 - Windows サービス コンポーネントをインストールし、そのスタートアップの種類を設定する必要があります。 「自動」に。
製品が再構成された場合、状態を再評価し、両方のシナリオに対して適切に対処する必要があります。

問題は、機能のインストール状態とコンポーネントの状態の両方が同じ CostFinalize アクションで評価されるため、Windows サービス コンポーネントの状態で機能のインストール状態を使用できないことです ( 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 操作の後に他の機能のインストール状態に基づいてこの機能のインストール状態を設定するカスタム アクションを作成しようとすることもできますが、それは別の機能のインストール ロジックを複雑にする継ぎ目があります。シナリオ (インストール、再構成、ロールバック、アンインストール) を修正し、エラーを起こしやすくします。

何を提案しますか?

4

1 に答える 1

0

最終的に、windows サービス コンポーネントのみを含む機能 C の子機能を作成し、CostFinalize の後にスケジュールされる 2 つの MsiSetFeatureState カスタム アクションでそのインストール状態を制御します。再構成され、「legacy-mode」フラグが設定され、機能 C がインストールまたは再構成され、「legacy-mode」フラグが設定されていない場合に、状態を install-local に設定する別のもの。Windows サービス コンポーネントは、機能 A、機能 B、および機能 C のこの子機能の間で引き続き共有されます。これは問題なく機能するようです。

于 2013-02-18T08:39:20.933 に答える