私のハッキーな解決策は、ファイルを変更して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