9

問題

インストール中にWindowsサービスを作成および開始し、アンインストール中にサービスを停止および削除するMSIがあります。これは、単独でインストールおよびアンインストールする場合は正常に機能しますが、アップグレードすると、 [使用中のファイル]ダイアログが表示され(新しいRestart Managerのため、Vista以降のみ)、サービスが使用中であることを示します。

バックグラウンド

[使用中のファイル]ダイアログは、 InstallValidateカスタムアクションによるInstallExecuteシーケンス中に表示されます。これは、 RemoveExistingProductsカスタムアクションの直前にスケジュールされます。これは、以前のバージョンがまだアンインストールされていないことを意味するため、 [使用中のファイル]ダイアログ表示されます。

MSDNのドキュメントには、RemoveExistingProductsアクションをInstallValidateアクションの後にスケジュールする必要があることが示されています。現在、RemoveExistingProductsアクションはInstallValidateアクションの直後にスケジュールされています。

考えられる解決策

RemoveExistingProductsカスタムアクションをInstallValidateカスタムアクションの直前に再スケジュールして、以前のインストールで[使用中のファイル]ダイアログが表示される前にサービスを停止して削除できるようにします。アクションのスケジュールを変更しようとしましたが、悪影響はなく正常に機能しているようです(ただし、ログには、 RemoveExistingProductsアクションの前にInstallValidateアクションが実行されることが示されています)が、MSDNドキュメントに違反しているため、このソリューションの使用を躊躇しています。 、そして私がまだ見ていなかった悪影響があるかもしれません。

誰かがこれを試しましたか?私が考えることができる他の唯一の選択肢は、新しいインストールで古いインストールのサービスを停止することですが、アップグレードできるすべての古いインストールに関する情報がインストールに必要になるため、これは望ましくありません(この特定のサービスを停止すると、より多くの情報が必要になる場合があります) Service Managerを呼び出して停止するだけではありません)。

4

4 に答える 4

6

質問で概説されている潜在的なソリューションを実装し、InstallValidateの直前にRemoveExistingProductsをスケジュールしました。まだ問題はありませんが、インストールが使いこなされたらまた投稿します。

アップデート

私たちのインストールではこれをしばらく使用していますが、悪影響はありません。

于 2010-02-16T15:13:10.447 に答える
2

すでにMSI/Windowsインストーラーに組み込まれています...唯一の問題は、.NETインストーラークラスがMSIの「サービスインストール」機能を使用しないことです。実際に起こっていることは、MSIがファイルをインストールし、コピーしたばかりのファイルを使用してカスタムコマンドを実行しようとしていることです(つまり、Visual StudioがMSIに入れているのはすべてです)。

これを解決するには、ORCAを使用してMSIを編集し、ServiceControlテーブルに次の行を追加します。

1   ServiceName 170     1   C__489628C5CC1144CB47F43E8BE7F3F31D

FILESテーブルから検索できるコンポーネントID...メインのEXEファイルのコンポーネントIDを選択しました。170は、インストールおよびアンインストール時にサービスを停止および削除するようにWindowsインストーラーに指示するビットマップです。

これにより、.NETインストーラーがサービスを追加するための道が開かれ、カスタムコマンドを使用してインストールした後、ServiceControllerを使用してサービスを開始できます。

于 2011-04-07T04:58:05.307 に答える
0

潜在的な問題の1つは、InstallValidate中に(たとえば、十分なディスク容量や使用中のファイルがないために)ユーザーがキャンセルした場合、ロールバックの動作はどうなるかということです。理想的な状況は、アプリケーションの状態が以前と同じである(たとえば、前のアプリケーションがインストールされている)ことです。ロールバックはなくても生きていける機能かもしれませんが、シーケンス処理をあきらめているかもしれません。

于 2010-01-28T22:24:00.190 に答える
0

これは、MSDNのドキュメントに違反することなく、将来の問題を回避するのに役立つと思います。「InstalledORPREVIOUSVERSIONSINSTALLED」という条件を設定すると、FindRelatedProductsのInstallValidateアクションの前にプロパティPREVIOUSVERSIONSINSTALLEDが設定されるため、アップグレードも可能になります。理由はわかりませんが、プロパティPREVIOUSVERSIONSINSTALLEDはMSDNに文書化されていませんが、存在し、非常に役立ちます。

于 2013-12-20T20:31:20.117 に答える