31

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

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

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


編集:

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

4

6 に答える 6

17

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>

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

于 2008-11-29T23:54:16.087 に答える
9

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

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

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

于 2008-11-29T21:24:29.103 に答える
9

Visual Studio のセットアップ プロジェクトは使用していないので間違っているかもしれませんが、Windows インストーラーの標準機能である ServiceInstall および ServiceControl テーブルをサポートしていないようです。これらの 2 つのテーブルは、サービスのインストールと更新専用です。

Wixはそれをサポートしています (この例を参照してください)。おそらく、マージ モジュールを作成して、それをプロジェクトで使用できます。

それ以外の場合は、これが役立つ場合があります: Visual Studio でサービスをインストールする (Phil Wilson)

于 2008-11-29T21:09:57.883 に答える
2

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

于 2008-11-29T19:47:05.960 に答える
0

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

このRunCommandComビットは、How to run DOS/CMD/Command Prompt commands from VB.NET? から露骨に切り取られていることに注意してください。

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

'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
于 2013-01-11T13:26:03.667 に答える
0

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

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

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

于 2008-11-29T19:59:22.707 に答える