第一次提交至Git
This commit is contained in:
241
AUTS_UpdateService/WinService.vb
Normal file
241
AUTS_UpdateService/WinService.vb
Normal file
@@ -0,0 +1,241 @@
|
||||
Imports System.ComponentModel
|
||||
Imports System.ServiceProcess
|
||||
Imports System.Configuration.Install
|
||||
Imports System.Reflection
|
||||
|
||||
Public Class WinService
|
||||
''' <summary>
|
||||
''' 描述服务的状态
|
||||
''' </summary>
|
||||
Enum ServiceStatusEnum
|
||||
<Description("未知")>
|
||||
Unknown
|
||||
<Description("不存在")>
|
||||
Nonentity
|
||||
<Description("已存在")>
|
||||
Exists
|
||||
<Description("停止中")>
|
||||
StopPending
|
||||
<Description("已停止")>
|
||||
Stopped
|
||||
<Description("启动中")>
|
||||
StartPending
|
||||
<Description("已启动")>
|
||||
Started
|
||||
End Enum
|
||||
|
||||
|
||||
''' <summary>
|
||||
''' 获取枚举描述特性
|
||||
''' </summary>
|
||||
''' <param name="enumValue">需要获取特性的枚举值</param>
|
||||
''' <returns>枚举描述特性</returns>
|
||||
Public Shared Function GetEnumDescription(enumValue As [Enum]) As String
|
||||
Dim fi As FieldInfo = enumValue.GetType().GetField(enumValue.ToString())
|
||||
Dim attr() As DescriptionAttribute =
|
||||
DirectCast(fi.GetCustomAttributes(GetType(DescriptionAttribute),
|
||||
False), DescriptionAttribute())
|
||||
|
||||
If attr.Length > 0 Then
|
||||
Return attr(0).Description
|
||||
Else
|
||||
Return enumValue.ToString()
|
||||
End If
|
||||
End Function
|
||||
|
||||
|
||||
''' <summary>
|
||||
''' 检测服务是否存在
|
||||
''' </summary>
|
||||
''' <param name="serviceName">需要检测的服务名称</param>
|
||||
''' <returns>服务是否存在</returns>
|
||||
Public Shared Function ServicesExists(serviceName As String) As Boolean
|
||||
Dim services() As ServiceController = ServiceController.GetServices
|
||||
For Each service As ServiceController In services
|
||||
If service.ServiceName = serviceName Then
|
||||
Return True
|
||||
End If
|
||||
Next
|
||||
Return False
|
||||
End Function
|
||||
|
||||
|
||||
''' <summary>
|
||||
''' 获取服务的状态
|
||||
''' </summary>
|
||||
''' <param name="serviceName">服务名称</param>
|
||||
''' <returns></returns>
|
||||
Public Shared Function ServicesStatus(serviceName As String) As ServiceStatusEnum
|
||||
Dim status As ServiceStatusEnum
|
||||
Try
|
||||
If ServicesExists(serviceName) Then
|
||||
status = ServiceStatusEnum.Exists
|
||||
|
||||
Try
|
||||
Dim service As New ServiceController(serviceName)
|
||||
If service.Status = ServiceControllerStatus.Running Then
|
||||
status = ServiceStatusEnum.Started
|
||||
ElseIf service.Status = ServiceControllerStatus.StartPending OrElse
|
||||
service.Status = ServiceControllerStatus.ContinuePending Then
|
||||
status = ServiceStatusEnum.StartPending
|
||||
ElseIf service.Status = ServiceControllerStatus.StopPending OrElse
|
||||
service.Status = ServiceControllerStatus.PausePending Then
|
||||
status = ServiceStatusEnum.StopPending
|
||||
Else
|
||||
status = ServiceStatusEnum.Stopped
|
||||
End If
|
||||
Catch ex As Exception
|
||||
ApplicationLog.WriteErrorLog($"ServicesStatus Error:{ex.Message}")
|
||||
End Try
|
||||
Else
|
||||
status = ServiceStatusEnum.Nonentity
|
||||
End If
|
||||
Catch ex As Exception
|
||||
status = ServiceStatusEnum.Unknown
|
||||
ApplicationLog.WriteErrorLog($"Check ServicesStatus Error:{ex.Message}")
|
||||
End Try
|
||||
Return status
|
||||
End Function
|
||||
|
||||
|
||||
''' <summary>
|
||||
''' 安装服务
|
||||
''' </summary>
|
||||
''' <param name="filePath">服务程序所在路径</param>
|
||||
''' <param name="savedState">服务状态,未知字段</param>
|
||||
Public Shared Sub InstallService(filePath As String, savedState As IDictionary)
|
||||
Dim app As AppDomain = AppDomain.CreateDomain("MyDomain")
|
||||
Try
|
||||
Dim assName As String = GetType(AssemblyInstaller).Assembly.FullName
|
||||
Dim fullName As String = GetType(AssemblyInstaller).FullName
|
||||
|
||||
Using installer As AssemblyInstaller = CType(app.CreateInstanceAndUnwrap(assName, fullName), AssemblyInstaller)
|
||||
installer.UseNewContext = True
|
||||
installer.Path = filePath
|
||||
installer.Install(savedState)
|
||||
installer.Commit(savedState)
|
||||
installer.Dispose()
|
||||
End Using
|
||||
|
||||
AppDomain.Unload(app)
|
||||
GC.Collect()
|
||||
Catch ex As Exception
|
||||
AppDomain.Unload(app)
|
||||
GC.Collect()
|
||||
Throw
|
||||
End Try
|
||||
End Sub
|
||||
|
||||
|
||||
''' <summary>
|
||||
''' 卸载服务
|
||||
''' </summary>
|
||||
''' <param name="filePath">服务程序所在路径</param>
|
||||
''' <param name="savedState">服务状态,未知字段</param>
|
||||
Public Shared Sub UnInstallService(filePath As String, savedState As IDictionary)
|
||||
Dim app As AppDomain = AppDomain.CreateDomain("MyDomain")
|
||||
Try
|
||||
Dim assName As String = GetType(AssemblyInstaller).Assembly.FullName
|
||||
Dim fullName As String = GetType(AssemblyInstaller).FullName
|
||||
|
||||
Using installer As AssemblyInstaller = CType(app.CreateInstanceAndUnwrap(assName, fullName), AssemblyInstaller)
|
||||
installer.UseNewContext = True
|
||||
installer.Path = filePath
|
||||
installer.Uninstall(savedState)
|
||||
installer.Dispose()
|
||||
End Using
|
||||
AppDomain.Unload(app)
|
||||
GC.Collect()
|
||||
Catch ex As Exception
|
||||
AppDomain.Unload(app)
|
||||
GC.Collect()
|
||||
Throw
|
||||
End Try
|
||||
|
||||
End Sub
|
||||
|
||||
|
||||
''' <summary> 检测服务---状态 </summary>
|
||||
Public Shared Function TestingServicesStatus(serviceName As String) As Boolean
|
||||
Dim pServiceName As ServiceController = New ServiceController(serviceName)
|
||||
Try
|
||||
Return Not (pServiceName.Status = ServiceControllerStatus.Stopped)
|
||||
Catch ex As Exception
|
||||
Throw New Exception(ex.Message)
|
||||
End Try
|
||||
End Function
|
||||
|
||||
|
||||
''' <summary>
|
||||
''' 开启服务
|
||||
''' </summary>
|
||||
''' <param name="serviceName">服务名称</param>
|
||||
''' <returns>开启服务结果</returns>
|
||||
Public Shared Function StartService(serviceName As String) As Boolean
|
||||
Try
|
||||
Using service As ServiceController = New ServiceController(serviceName)
|
||||
If service.Status <> ServiceControllerStatus.Running OrElse
|
||||
service.Status <> ServiceControllerStatus.StartPending OrElse
|
||||
service.Status <> ServiceControllerStatus.ContinuePending Then
|
||||
service.Start()
|
||||
End If
|
||||
End Using
|
||||
Catch ex As Exception
|
||||
ApplicationLog.WriteErrorLog($"StartService Error:{ex.Message}")
|
||||
Return False
|
||||
End Try
|
||||
Return True
|
||||
End Function
|
||||
|
||||
|
||||
''' <summary>
|
||||
''' 关闭服务
|
||||
''' </summary>
|
||||
''' <param name="serviceName">服务名称</param>
|
||||
''' <returns>关闭服务结果</returns>
|
||||
Public Shared Function StopService(serviceName As String) As Boolean
|
||||
Try
|
||||
Using service As ServiceController = New ServiceController(serviceName)
|
||||
If service.Status = ServiceControllerStatus.Running OrElse
|
||||
service.Status = ServiceControllerStatus.StartPending OrElse
|
||||
service.Status = ServiceControllerStatus.ContinuePending Then
|
||||
service.Stop()
|
||||
End If
|
||||
End Using
|
||||
Catch ex As Exception
|
||||
ApplicationLog.WriteErrorLog($"StopService Error:{ex.Message}")
|
||||
Return False
|
||||
End Try
|
||||
Return True
|
||||
End Function
|
||||
|
||||
''' <summary>
|
||||
''' 重启服务
|
||||
''' </summary>
|
||||
''' <param name="serviceName">服务名称</param>
|
||||
''' <returns></returns>
|
||||
Public Shared Function RestartService(serviceName As String) As Boolean
|
||||
Try
|
||||
Using service As ServiceController = New ServiceController(serviceName)
|
||||
If service.Status = ServiceControllerStatus.Running OrElse
|
||||
service.Status = ServiceControllerStatus.StartPending OrElse
|
||||
service.Status = ServiceControllerStatus.ContinuePending Then
|
||||
service.Stop()
|
||||
|
||||
While service.Status = ServiceControllerStatus.Running AndAlso
|
||||
service.Status = ServiceControllerStatus.StopPending
|
||||
service.Refresh()
|
||||
Threading.Thread.Sleep(20)
|
||||
End While
|
||||
End If
|
||||
Threading.Thread.Sleep(100)
|
||||
service.Start()
|
||||
End Using
|
||||
Catch ex As Exception
|
||||
ApplicationLog.WriteErrorLog($"RestartService:{ex.Message}")
|
||||
Return False
|
||||
End Try
|
||||
|
||||
Return True
|
||||
End Function
|
||||
End Class
|
||||
Reference in New Issue
Block a user