#vb.net
#vb.net
Вопрос:
Я создал службу с именем «IranStockCodal» и «Успешно» собрал и установил ее в службах Windows, но когда я запускаю ее, в окне служб Windows появляется предупреждение: «Служба «IranStockCodal» на локальном компьютере запущена, а затем остановлена. Некоторые службы автоматически останавливаются, если они не используются другими службами или программами «. Задача «Вызвать vbIranStock.Вызываемый VBNetLib.vbScript4.VbsRun4 (False) «действительно работает в консольном приложении, но когда я импортирую и вызываю его из службы, это не так. пожалуйста, помогите мне, что нужно сделать, чтобы решить эту проблему.
Imports System.IO
Imports System.Threading
Imports System.Configuration
Imports vbIranStock.VBNetLib.vbScript4
Imports vbIranStock
Public Class Service1
Protected Overrides Sub OnStart(ByVal args() As String)
Me.WriteToFile("Iran Stock Codal started at " DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss tt"))
Call vbIranStock.VBNetLib.vbScript4.VbsRun4(False)
Me.WriteToFile("Iran Stock Codal Task Called at " DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss tt"))
Me.ScheduleService()
End Sub
Protected Overrides Sub OnStop()
Me.WriteToFile("Iran Stock Codal Service stopped at " DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss tt"))
Me.Schedular.Dispose()
End Sub
Private Schedular As Timer
Public Sub ScheduleService()
Try
Schedular = New Timer(New TimerCallback(AddressOf SchedularCallback))
Dim mode As String = ConfigurationManager.AppSettings("Mode").ToUpper()
Me.WriteToFile((Convert.ToString("Iran Stock Codal Service Mode: ") amp; mode) " {0}")
'Set the Default Time.
Dim scheduledTime As DateTime = DateTime.MinValue
If mode.ToUpper() = "DAILY" Then
'Get the Scheduled Time from AppSettings.
scheduledTime = DateTime.Parse(System.Configuration.ConfigurationManager.AppSettings("ScheduledTime"))
If DateTime.Now > scheduledTime Then
'If Scheduled Time is passed set Schedule for the next day.
scheduledTime = scheduledTime.AddDays(1)
End If
End If
If mode.ToUpper() = "INTERVAL" Then
'Get the Interval in Minutes from AppSettings.
Dim intervalMinutes As Integer = Convert.ToInt32(ConfigurationManager.AppSettings("IntervalMinutes"))
'Set the Scheduled Time by adding the Interval to Current Time.
scheduledTime = DateTime.Now.AddMinutes(intervalMinutes)
If DateTime.Now > scheduledTime Then
'If Scheduled Time is passed set Schedule for the next Interval.
scheduledTime = scheduledTime.AddMinutes(intervalMinutes)
End If
End If
Dim timeSpan As TimeSpan = scheduledTime.Subtract(DateTime.Now)
Dim schedule As String = String.Format("{0} day(s) {1} hour(s) {2} minute(s) {3} seconds(s)", timeSpan.Days, timeSpan.Hours, timeSpan.Minutes, timeSpan.Seconds)
Me.WriteToFile((Convert.ToString("Iran Stock Codal Service scheduled to run after: ") amp; schedule) " {0}")
'Get the difference in Minutes between the Scheduled and Current Time.
Dim dueTime As Integer = Convert.ToInt32(timeSpan.TotalMilliseconds)
'Change the Timer's Due Time.
Schedular.Change(dueTime, Timeout.Infinite)
Catch ex As Exception
WriteToFile("Iran Stock Codal Service Error on: {0} " ex.Message ex.StackTrace)
'Stop the Windows Service.
Using serviceController As New System.ServiceProcess.ServiceController("IranStockCodal")
serviceController.[Stop]()
End Using
End Try
End Sub
Private Sub SchedularCallback(e As Object)
Me.WriteToFile("Iran Stock Codal Service Log: " DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss tt"))
Me.ScheduleService()
End Sub
Private Sub WriteToFile(text As String)
Dim path As String = "C:ServiceLog.txt"
Using writer As New StreamWriter(path, True)
writer.WriteLine(String.Format(text, DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss tt")))
writer.Close()
End Using
End Sub
End Class
Вот установленные проектом коды:
Imports System.ComponentModel
Imports System.Configuration.Install
Public Class ProjectInstaller
Public Sub New()
MyBase.New()
'This call is required by the Component Designer.
InitializeComponent()
'Add initialization code after the call to InitializeComponent
End Sub
Protected Overrides Sub OnAfterInstall(savedState As IDictionary)
MyBase.OnAfterInstall(savedState)
'The following code starts the services after it is installed.
Using serviceController As New System.ServiceProcess.ServiceController(ServiceInstaller1.ServiceName)
serviceController.Start()
End Using
End Sub
Private Sub ServiceInstaller1_AfterInstall(sender As Object, e As InstallEventArgs) Handles ServiceInstaller1.AfterInstall
End Sub
Private Sub ServiceProcessInstaller1_AfterInstall(sender As Object, e As InstallEventArgs) Handles ServiceProcessInstaller1.AfterInstall
End Sub
End Class
Вот коды ComponentModel
<System.ComponentModel.RunInstaller(True)> Partial Class ProjectInstaller
Inherits System.Configuration.Install.Installer
'Installer overrides dispose to clean up the component list.
<System.Diagnostics.DebuggerNonUserCode()> _
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
Try
If disposing AndAlso components IsNot Nothing Then
components.Dispose()
End If
Finally
MyBase.Dispose(disposing)
End Try
End Sub
'Required by the Component Designer
Private components As System.ComponentModel.IContainer
'NOTE: The following procedure is required by the Component Designer
'It can be modified using the Component Designer.
'Do not modify it using the code editor.
<System.Diagnostics.DebuggerStepThrough()>
Private Sub InitializeComponent()
Me.ServiceProcessInstaller1 = New System.ServiceProcess.ServiceProcessInstaller()
Me.ServiceInstaller1 = New System.ServiceProcess.ServiceInstaller()
'
'ServiceProcessInstaller1
'
Me.ServiceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalSystem
'
'ServiceInstaller1
'
Me.ServiceInstaller1.ServiceName = "IranStockCodal"
Me.ServiceInstaller1.StartType = System.ServiceProcess.ServiceStartMode.Automatic
'
'ProjectInstaller
'
Me.Installers.AddRange(New System.Configuration.Install.Installer() {Me.ServiceProcessInstaller1, Me.ServiceInstaller1})
End Sub
Friend WithEvents ServiceProcessInstaller1 As System.ServiceProcess.ServiceProcessInstaller
Friend WithEvents ServiceInstaller1 As System.ServiceProcess.ServiceInstaller
End Class
Комментарии:
1. Обычно, когда я вижу такое поведение, это связано с тем, что служба выходит из строя при запуске, поскольку вы можете запустить ее как консольное приложение, вероятным виновником, вероятно, являются разрешения. Является ли «C:ServiceLog.txt «файл создается, и запуск даже регистрируется?
2. @Hursey Когда я удаляю и устанавливаю службу или запускаю ее вручную, записывается новое время запуска журнала. но она не продолжает запускать «VbsRun4».
3. Значит, она не записывает никаких ошибок в ваш файл журнала?
4. @Hursey Нет, это не так. Вывод только такой: «Иранский биржевой код запущен в 25.08.2010 01: 10: 48 вечера»
5. Несколько вещей, которые нужно попробовать. Можете ли вы подключить отладчик к службе, возможно, это прольет некоторый свет на проблему. Следующее, попробуйте изменить пользователя, которого запускает служба, на что-то с большими правами