0

WiX 3.7 を使用してインストーラーを作成した Windows サービス (.NET で記述) があります。これはインフラストラクチャの役割を果たし、誰でもそれを使用する別の Windows サービスを作成できます。私のサービスは、他のそのようなサービスが使用するときに実行する必要があるため、他のサービスのインストーラーは、インストール中に私のサービスを「サービスの依存関係」として定義します。

残念ながら、Windows では、他のサービスが Windows サービスに依存している場合でも、Windows サービスを削除できるようです。他の依存サービスがまだそのマシンにインストールされている場合、インストーラーでエラーを発生させ、サービスのアンインストールに失敗させたいと考えています。

私は、他のサービスが私のものの上に構築されるかどうかわからないので、チェックをハードコードすることはできません。

WiXでこれを行う方法はありますか?

4

1 に答える 1

1

カスタム アクションを記述し、サービスを使用している他のサービスがある場合はアンインストールを失敗させます。

OpenSCManager+ EnumServicesStatusEx(すべてのサービスを見つけるため) + OpenService+ QueryServerConfig(依存関係を見つけるため)

カスタム アクションは WiX 変数 (「SERVICE_IS_USED」など) を設定し、Condition 要素でテストする必要があります。

  <Condition Message ="Stop using me first!">
    SERVICE_IS_USED = "0"
  </Condition>

(実際には、追加の条件を追加して、これがアンインストール中にのみ適用されるようにし、サービスが使用中であってもアンインストールを許可する FORCE オプションを許可することを真剣に検討します.

.Net ではなく、C または C++ でカスタム アクションを作成することをお勧めします。.Net でカスタム アクションを実行するためのブートストラップ プロセスは、私を怖がらせます。

インストーラーが .Net フレームワークや C ランタイム ライブラリなどの依存関係をインストールするためのブーストラップをまだ持っていない場合は、さらに進んで、C ランタイム ライブラリを使用しない方法で C でカスタム アクションを作成することをお勧めします (単にWindows API 呼び出し)。

PSちなみに、これは本当に.Netに関連しているとは思いません-それは、Windowsサービス、wix、およびwindows-installerです。

于 2013-09-24T14:49:48.183 に答える