Csharp/CSharp Tutorial/Windows/Service
Содержание
Build a service by subclassing System.ServiceProcess.ServiceBase
<source lang="csharp">using System; using System.Collections; using System.ruponentModel; using System.Data; using System.Diagnostics; using System.ServiceProcess; public class Service1 : System.ServiceProcess.ServiceBase {
private System.Diagnostics.EventLog eventLog1;
public Service1() { this.eventLog1 = new System.Diagnostics.EventLog(); ((System.ruponentModel.ISupportInitialize)(this.eventLog1)).BeginInit(); this.eventLog1.Log = "MyCustomLog"; this.eventLog1.Source = "CustomEventService2"; this.AutoLog = false; this.ServiceName = "CustomEventService"; ((System.ruponentModel.ISupportInitialize)(this.eventLog1)).EndInit(); } // The main entry point for the process static void Main() { System.ServiceProcess.ServiceBase[] ServicesToRun; ServicesToRun = new System.ServiceProcess.ServiceBase[] { new Service1() }; System.ServiceProcess.ServiceBase.Run(ServicesToRun); } protected override void OnStart(string[] args) { eventLog1.WriteEntry( "Hello", EventLogEntryType.Information ); } protected override void OnStop() { eventLog1.WriteEntry( "Goodbye", EventLogEntryType.Warning ); }
}</source>
Implement the service interface
<source lang="csharp">using System; using System.Timers; using System.ServiceProcess; class MyService : ServiceBase {
public MyService() { ServiceName = "My Service"; AutoLog = true; CanStop = true; CanPauseAndContinue = true; CanHandleSessionChangeEvent = true; } protected override void OnStart(string[] args) { EventLog.WriteEntry("MyService Service starting. "); } protected override void OnStop() { EventLog.WriteEntry("MyService Service stopping..."); } protected override void OnPause() { EventLog.WriteEntry("MyService Service pausing..."); } protected override void OnContinue() { EventLog.WriteEntry("MyService Service resuming..."); } protected override void OnSessionChange(SessionChangeDescription change) { EventLog.WriteEntry("MyService Session change..." + change.Reason); } public static void Main() { ServiceBase.Run(new MyService()); }
}</source>
Service control: start and stop
<source lang="csharp">using System; using System.ServiceProcess; class MainClass {
public static void Main() { ServiceController scAlerter = new ServiceController("Alerter"); Console.WriteLine(scAlerter.DisplayName); Console.WriteLine(scAlerter.CanStop); scAlerter.Stop(); Console.WriteLine("Service stopped"); scAlerter.Start(); Console.WriteLine("Service started"); }
}</source>
Alerter False Unhandled Exception: System.InvalidOperationException: Cannot stop Alerter service on computer ".". ---> System.ruponentModel.Win32Exception: The service has not been started --- End of inner exception stack trace --- at System.ServiceProcess.ServiceController.Stop() at MainClass.Main()
Simplest service
<source lang="csharp">using System; using System.Collections; using System.ruponentModel; using System.Data; using System.Diagnostics; using System.ServiceProcess; public class Service1 : System.ServiceProcess.ServiceBase {
public Service1() { this.ServiceName = "MyRealService"; } static void Main() { System.ServiceProcess.ServiceBase[] ServicesToRun; ServicesToRun = new System.ServiceProcess.ServiceBase[] { new Service1() }; System.ServiceProcess.ServiceBase.Run(ServicesToRun); } protected override void OnStart(string[] args) { int x = 1; } protected override void OnStop() { }
}</source>