MS Service

This commit is contained in:
Digital Data - Marlon Schreiber 2018-08-22 16:26:01 +02:00
parent db7cafdbf8
commit f2292bc92e
5 changed files with 273 additions and 13 deletions

View File

@ -6,7 +6,7 @@
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{63B0EAA3-8BF5-46DA-9040-15E781F4C3B1}</ProjectGuid>
<OutputType>WinExe</OutputType>
<StartupObject>DDTestService.Service1</StartupObject>
<StartupObject>DDTestService.MyNewService</StartupObject>
<RootNamespace>DDTestService</RootNamespace>
<AssemblyName>DDTestService</AssemblyName>
<FileAlignment>512</FileAlignment>
@ -56,6 +56,7 @@
</Reference>
<Reference Include="System" />
<Reference Include="System.Configuration" />
<Reference Include="System.Configuration.Install" />
<Reference Include="System.Data" />
<Reference Include="System.Deployment" />
<Reference Include="System.IO.Compression" />
@ -102,6 +103,12 @@
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
<Compile Include="ProjectInstaller.Designer.vb">
<DependentUpon>ProjectInstaller.vb</DependentUpon>
</Compile>
<Compile Include="ProjectInstaller.vb">
<SubType>Component</SubType>
</Compile>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="My Project\Resources.resx">
@ -113,6 +120,9 @@
<EmbeddedResource Include="MyNewService.resx">
<DependentUpon>MyNewService.vb</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="ProjectInstaller.resx">
<DependentUpon>ProjectInstaller.vb</DependentUpon>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<None Include="My Project\Application.myapp">

View File

@ -2,35 +2,94 @@
Imports DigitalData.Modules.Logging
Imports NLog
Public Class MyNewService
Private Shared _MyLoggerConfig As LogConfig
Public Shared threadRunner As BackgroundWorker
Private Shared Logger As Logger = LogManager.GetCurrentClassLogger
Private Shared _MyLoggerConfig1 As LogConfig
Private Shared _MyLoggerConfig2 As LogConfig
Public Shared threadRunner1 As BackgroundWorker
Private Shared Logger1 As Logger '= LogManager.GetCurrentClassLogger
Private Shared Logger2 As Logger '= LogManager.GetCurrentClassLogger
Private eventId As Integer = 1
Protected Overrides Sub OnStart(ByVal args() As String)
' '#Thread für Durchlauf generieren
threadRunner1 = New BackgroundWorker()
threadRunner1.WorkerReportsProgress = True
threadRunner1.WorkerSupportsCancellation = True
AddHandler threadRunner1.DoWork, AddressOf RUN_THREAD
AddHandler threadRunner1.RunWorkerCompleted, AddressOf Thread_Completed
' '### Den Timer generieren
Dim Timer1 As New System.Timers.Timer()
'Das Event hinterlegen welches bei "Tick" ausgelöst wird
AddHandler Timer1.Elapsed, AddressOf Thread1_Run
' Set the Interval
Timer1.Interval = 60000
'ClassLogger.Add("Timer - Intervall: " & clsSQLITE.konf_intervall & " Minuten", False)
Timer1.Enabled = True
Logger1.Info("Timer gestartet")
' Und den Durchlauf das erste Mal starten
threadRunner1.RunWorkerAsync()
' Code zum Starten des Dienstes hier einfügen. Diese Methode sollte Vorgänge
' ausführen, damit der Dienst gestartet werden kann.
_MyLoggerConfig = New LogConfig(LogConfig.PathType.CurrentDirectory)
' _MyLoggerConfig1 = New LogConfig(LogConfig.PathType.CurrentDirectory, Nothing, "Timer1")
_MyLoggerConfig2 = New LogConfig(LogConfig.PathType.CurrentDirectory, Nothing, "Timer2")
' clsLogger.Init(My.Application.Info.DirectoryPath & "\Log", "_SERVICEResultHandler")
Logger.Info("Service started")
Logger1.Info("Service started")
Logger2.Info("Service started")
' Set up a timer to trigger every minute.
Dim timer As System.Timers.Timer = New System.Timers.Timer()
timer.Interval = 60000 ' 60 seconds
AddHandler timer.Elapsed, AddressOf Me.OnTimer
timer.Interval = 30000 ' 30 seconds
AddHandler timer.Elapsed, AddressOf Me.OnTimer1
timer.Start()
End Sub
Private Sub OnTimer(sender As Object, e As Timers.ElapsedEventArgs)
Private Sub RUN_THREAD()
_MyLoggerConfig1 = New LogConfig(LogConfig.PathType.CurrentDirectory, Nothing, "TimerXYZ")
Logger1 = LogManager.GetCurrentClassLogger
' TODO: Insert monitoring activities here.
Logger.Info("Monitoring the System - eventId: " & eventId)
Logger1.Info("RUN_THREAD - Monitoring the System - eventId: " & eventId)
End Sub
Public Shared Sub Thread1_Run()
If Not threadRunner1.IsBusy Then
threadRunner1.RunWorkerAsync()
End If
End Sub
Private Shared Sub Thread_Completed(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) 'Handles threadDateiimport.RunWorkerCompleted
' This event fires when the DoWork event completes
Try
Dim result As String = ""
If e.Cancelled Then
Logger1.Warn("Der Process wurde durch den Anwender abgebrochen")
ElseIf e.Error IsNot Nothing Then
Logger1.Warn("Fehler bei Durchlauf. Der Vorgang wird abgebrochen: " & e.Error.Message)
End If
Catch ex As Exception
EventLog.WriteEntry("DDWMResultHandler", "Unexpected error in Thread_Completed: " & ex.ToString(), EventLogEntryType.Error)
End Try
End Sub
Private Sub OnTimer1(sender As Object, e As Timers.ElapsedEventArgs)
_MyLoggerConfig2 = New LogConfig(LogConfig.PathType.CurrentDirectory, Nothing, "Timer1")
Logger2 = LogManager.GetCurrentClassLogger
' TODO: Insert monitoring activities here.
Logger2.Info("OnTimer1 - Monitoring the System - eventId: " & eventId)
eventId = eventId + 1
End Sub
Protected Overrides Sub OnStop()
' Hier Code zum Ausführen erforderlicher Löschvorgänge zum Beenden des Dienstes einfügen.
Logger.Info("Service stopped")
Logger1.Info("Service stopped")
Logger2.Info("Service stopped")
End Sub
Protected Overrides Sub OnPause()
Logger.Info("In OnPause...")
Logger1.Info("In OnPause...")
Logger2.Info("In OnPause...")
End Sub
Protected Overrides Sub OnContinue()
Logger.Info("In OnContinue...")
Logger1.Info("In OnContinue...")
Logger2.Info("In OnContinue...")
End Sub
End Class

View File

@ -0,0 +1,46 @@
<System.ComponentModel.RunInstaller(True)> Partial Class ProjectInstaller
Inherits System.Configuration.Install.Installer
'Installer überschreibt den Löschvorgang zum Bereinigen der Komponentenliste.
<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
'Wird vom Komponenten-Designer benötigt.
Private components As System.ComponentModel.IContainer
'Hinweis: Die folgende Prozedur ist für den Komponenten-Designer erforderlich.
'Das Bearbeiten ist mit dem Komponenten-Designer möglich.
'Das Bearbeiten mit dem Code-Editor ist nicht möglich.
<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.LocalService
Me.ServiceProcessInstaller1.Password = Nothing
Me.ServiceProcessInstaller1.Username = Nothing
'
'ServiceInstaller1
'
Me.ServiceInstaller1.Description = "TestService für testzwecke"
Me.ServiceInstaller1.ServiceName = "MyNewService"
'
'ProjectInstaller
'
Me.Installers.AddRange(New System.Configuration.Install.Installer() {Me.ServiceProcessInstaller1, Me.ServiceInstaller1})
End Sub
Friend WithEvents ServiceProcessInstaller1 As ServiceProcess.ServiceProcessInstaller
Friend WithEvents ServiceInstaller1 As ServiceProcess.ServiceInstaller
End Class

View File

@ -0,0 +1,129 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="ServiceProcessInstaller1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="ServiceInstaller1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>197, 17</value>
</metadata>
<metadata name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</metadata>
</root>

View File

@ -0,0 +1,16 @@
Imports System.ComponentModel
Imports System.Configuration.Install
Public Class ProjectInstaller
Public Sub New()
MyBase.New()
'Dieser Aufruf ist für den Komponenten-Designer erforderlich.
InitializeComponent()
'Initialisierungscode nach dem Aufruf von InitializeComponent hinzufügen
End Sub
End Class