如何在VB.net中重新运行可执行文件

时间:2010-02-09 18:50:03

标签: vb.net windows-services executable

我完全是VB.net的新手,现在我正在开发一个Windows服务,它将在启动时启动* .exe。如果被其他程序杀死,如何检测并重新启动此可执行文件的进程?

我的代码如下:

Public Class MyWinService
Dim RetVal
Protected Overrides Sub OnStart(ByVal args() As String)
    EventLog.WriteEntry("MyService Started")

    RetVal = Shell("JobService.exe", 1)

End Sub

Protected Overrides Sub OnStop()
    EventLog.WriteEntry("MyService Stopped")
    Dim myProcess = Process.GetProcessById(RetVal)
    myProcess.Kill()
End Sub

Protected Overrides Sub OnPause()
    EventLog.WriteEntry("MyService Paused")
End Sub

Protected Overrides Sub OnContinue()
    EventLog.WriteEntry("MyService Resumed")
End Sub

Protected Overrides Sub OnCustomCommand(ByVal command As Integer)
    If command = 200 Then
        EventLog.WriteEntry("Custom Command 200 invoked")
    ElseIf command = 210 Then
        EventLog.WriteEntry("Custom Command 210 invoked")
    End If
End Sub

Private Sub Process1_Exited(ByVal sender As System.Object, ByVal e As System.EventArgs)

End Sub

结束班

提前多多感谢!

2 个答案:

答案 0 :(得分:3)

执行此操作的错误方法是在OnStart()方法中创建Process对象。将方法绑定到重新启动对象的进程对象的Exited事件。 http://msdn.microsoft.com/en-us/library/system.diagnostics.process.onexited(VS.71).aspx提供有关已退出事件的一些信息。

正确的方法是创建一个Timer对象。每隔X分钟,创建一个Process对象,检查句柄ID,看它是否正在运行。如果没有,则创建一个新的可执行文件,类似于您在OnStart()方法上所做的操作。

http://csharpstruggles.blogspot.com/2005/02/using-timer-in-windows-service.html

http://social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/bc175c60-f81b-4d1a-975d-717368468238

如上所述,优雅的方式是在服务本身中完成工作。

答案 1 :(得分:2)

您可以使用process.start和process.Exited方法,如下所示:

Imports System.Diagnostics

Public Class Form1
Dim WithEvents proc As Process

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)_
  Handles Button1.Click
' start the process
proc = Process.Start(progName)
proc.EnableRaisingEvents = True
End Sub

Private Sub proc_Exited(ByVal sender As Object, ByVal e As System.EventArgs) _
  Handles proc.Exited
' restart the process whenever it exits
proc = Process.Start(progName)
proc.EnableRaisingEvents = True
End Sub

End Class