Windows サービスをインストールするインストーラーを作成しました。VS 2010 で Visual Studio の既定のインストーラーを使用しました。
サービスは、インストール フォルダに存在するデータベース ファイル (SQLite) にアクセスして書き込みます。
サービスが停止中または実行中のアンインストール中に、サービスはエラーなしでアンインストールされます。
しかし、インストーラーがバージョン 1 から 2 に移行され、以前のバージョンのサービスが実行されている場合、以前のインストール サービスが DB ファイルにアクセスしていたため、「ファイルがアプリケーションによってアクセスされています。再試行してください」というエラーが表示されました。
そのため、新しいバージョンをインストールする前に、以前のバージョンのサービスを停止する必要があります。インストールとアンインストールを管理するためのカスタム アクション スクリプトがあります。メソッドではBeforeInstall
、 を使用してサービスを停止するコードを記述しましたServiceController
。これにより、サービスが停止する可能性があります。
ServiceController service = new ServiceController("SERVICE_NAME");
if (!(service.Status.Equals(ServiceControllerStatus.Stopped)))
{ service.Stop(); service.WaitForStatus (System.ServiceProcess.ServiceControllerStatus.Stopped); }
しかし、BeforeInstall
方法の前であっても、インストーラーは新しいバージョンのファイルをコピーして、以前のバージョンのファイルを置き換えています。
私はいつも同じインストールフォルダを持っています。そのため、BeforeInstall カスタム アクションでサービスを停止するコードを記述しても、以前のバージョンのサービスによってアクセスされている DB ファイルが新しいバージョンによって削除されようとしたため、エラーがスローされます。アプリケーション。再試行してください。」
そのため、インストーラーがファイルをインストール フォルダーにコピーする前であっても、いくつかのフックが必要です。インストーラーが Db ファイルを更新しようとする前に、サービスを停止できるようにします。
任意のアイデアをいただければ幸いです。