ファイルを Program Files にコピーし、(コピーされたファイルの 1 つを介して) サービスを実行するインストーラーに取り組んでいます。最初のインストールではこれは問題なく動作しますが、インストーラーが実行され、サービスがマシン上で既に実行されている場合に問題が発生し始めます。これは、インストーラーが Program Files に既に存在するファイルを置き換えようとしているが、それらのファイルの 1 つが Windows サービスによって使用されているためです。そのため、サービスを停止しない限り、置き換えられません。
そこで、ServiceController API を使用して、インストールの開始時にサービスを停止し、ファイルをインストール (既存のファイルを上書き) して、サービスを再開することにしました。コードはほとんどありませんが、次のとおりです。
ServiceController をインスタンス化します。
try
{
service = new ServiceController(serviceName);
}
catch (InvalidOperationException ioe)
{
// ...
}
サービスの停止:
if (service.Status != ServiceControllerStatus.Stopped)
{
service.Stop();
}
次に、サービスが停止するのを待って、ファイルをインストールします。
service.WaitForStatus(ServiceControllerStatus.Stopped);
// install files...
最後にサービスを再起動します。
service.Start();
このコードを使用すると、service.WaitForStatus()
メソッドは永遠に待機します (または、少なくとも待機する準備ができているよりも長く、最大 1 時間まで待機します)。奇妙なことに、このコードを実行service.Status()
し、ログに書き込み、手動でサービスをチェックしてサービスが停止していることを確認し、ログをチェックして、サービスがまだ実行中であると ServiceController が認識していることを確認できます。
最初は問題があると思ったservice.Stop()
ので、サービスPIDを取得してタスクを強制終了するオブジェクトをいくつか作成してみましたProcess
。これにより、サービスが即座に停止しますが、それでもServiceController
サービスが停止したことを認識しません。コードからメソッドを削除するservice.WaitForStatus()
と、サービスで使用されているファイルをインストーラーが上書きしようとしているため、例外がスローされます。
また、さまざまなサービスでこれを試しましたが、結果は常に同じであり、問題はサービス自体にあるとは思えません。
ServiceController
サービスが停止したことを が認識しないのはなぜですか? この問題の解決策または回避策はありますか? 私は.NET 2.0を使用しているため、残念ながら、それ以上を必要とするものはすべて私にとって選択肢ではありません。乾杯。