webdevqa.jp.net

アンインストールせずにWindowsサービスをアップグレードする

現在、新しいバージョンをインストールする前に、古いバージョンのサービスをアンインストールする必要があります。これは、新しいサービスエントリを追加する前に、古いサービスエントリを更新または削除するほど賢くないことと関係があると確信しています。

サービスがすでに存在する場合、インストーラーにサービスの登録をスキップさせる方法はありますか? (インストールフォルダとサービス名はバージョン間で変わらないと思います。)

また、アンインストール時にサービスを自動的に停止する方法はありますか?


編集:

MSIパッケージとVisualStudioセットアッププロジェクトを使用しています。

30
Jonathan Allen

これは、ServiceInstallコマンドとSeviceControlコマンドを使用して.MSIファイルを生成するWiXで行いました。

<Component Id='c_WSService' Guid='*'>
    <File Id='f_WSService' Name='WSService.exe' Vital='yes' Source='..\wssvr\release\wsservice.exe' KeyPath="yes" />
    <ServiceInstall Id='WSService.exe' Name='WSService' DisplayName='[product name]' Type='ownProcess'
                    Interactive='no' Start='auto' Vital='yes' ErrorControl='normal'
                    Description='Provides local and remote access to [product name] search facilities.' />
    <ServiceControl Id='WSService.exe' Name='WSService' Start='install' Stop='both' Remove='uninstall' Wait='yes' />
</Component>

これにより、サービスが停止し、新しいバージョンがインストールされ、サービスが再開されます。

17
Ferruccio

コマンドラインからscツールを使用して、サービスを停止および開始します。

sc stop {name of your service}
sc start {name of your service}

サービスが停止したら、対応するファイルを更新してから、サービスを再開してください。インストーラーからもそれを行うことができるはずです。インストーラーに Wix を使用する場合は、 ServiceControl 要素を確認してください。

9
David Pokluda

Visual Studioセットアッププロジェクトを使用していないため、間違っている可能性がありますが、Windowsインストーラーの標準機能であるServiceInstallテーブルとServiceControlテーブルはサポートされていないようです。これらの2つのテーブルは、サービスのインストールと更新用に特別に用意されています。

Wix はそれをサポートします( この例を参照 )、多分あなたはマージモジュールを作成してあなたのプロジェクトでそれを使うことができます。

それ以外の場合は、これが役立つ可能性があります: Visual Studio(Phil Wilson)を使用したサービスのインストール

8
wimh

サービスを停止し、サービスの実行可能ファイルを上書きしてから、サービスを再起動することはできませんか?

2
jalf

私のハッキーな解決策は、ProjectInstaller.vbファイルを変更して、サービスを停止および削除するコマンドを発行してから、少し一時停止することです。おそらく、msiファイルを変更するほど見栄えのするインストールではありませんが、私のコードを継承する人にとってははるかに読みやすく、論理的です。

RunCommandComビットは VB.NETからDOS/CMD /コマンドプロンプトコマンドを実行する方法から明らかにクリブされていることに注意してください

このメソッドを インストール後にサービスを自動的に開始する方法 のコードと組み合わせて使用​​すると、必要なサービスのインストールエクスペリエンスを得ることができます-インストールして開始するサービス自動的に実行され、現在実行中のサービスがある場合は上書きされます。

'This works.  It leaves the MSI in a state that tells you to reboot the PC, but you really don't need to.

Private Sub ProjectInstaller_BeforeInstall(sender As Object, e As System.Configuration.Install.InstallEventArgs) Handles Me.BeforeInstall

    Dim sEchoMessage As String = String.Empty
    sEchoMessage &= " & ECHO ******************       Please be patient      *******************************"
    sEchoMessage &= " & ECHO Pausing to stop and delete the previous version of the following service:"
    sEchoMessage &= " & ECHO " & ServiceInstaller1.ServiceName
    sEchoMessage &= " & ECHO -------------------------------------------------------------------------------"
    sEchoMessage &= " & ECHO After install is complete, you may see a message that says you need to reboot."
    sEchoMessage &= " & ECHO You may IGNORE this message - The service will be installed and running."
    sEchoMessage &= " & ECHO There is NO Reboot required."
    sEchoMessage &= " & ECHO *******************************************************************************"

    RunCommandCom("sc stop " & ServiceInstaller1.ServiceName & " & sc delete " & ServiceInstaller1.ServiceName & sEchoMessage, 15000)

End Sub

Private Sub RunCommandCom(command As String, mSecSleepAfterExecution As Integer)

    Using p As Process = New Process()
        Dim pi As ProcessStartInfo = New ProcessStartInfo()
        pi.Arguments = " /K " + command
        pi.FileName = "cmd.exe"
        p.StartInfo = pi
        p.Start()
        System.Threading.Thread.Sleep(mSecSleepAfterExecution)
        p.CloseMainWindow()
    End Using

End Sub
0
edhubbell

作業を行うたびにどのサービスをロードして呼び出すかを個別にDLL作成できます。使用後にサービスがDLL)アンロードされることを確認してください。

使用すると、別のアプリケーションドメインにロードする必要があります。

SO http://msdn.Microsoft.com/en-us/library/c5b8a8f9.aspx

0
Din