C#操作Windows服务需要使用System.ServiceProcess.ServiceBase类。下面是使用这个类的完整攻略。
ServiceBase类
ServiceBase类是用于开发Windows服务的基类,它提供了操作Windows服务的方法和属性。
安装/卸载服务
安装Windows服务需要使用InstallUtil.exe工具,在Visual Studio开发环境下,该工具位于C:\Windows\Microsoft.NET\Framework\v4.0.30319目录下。
运行InstallUtil.exe程序,使用/install命令安装服务,使用/uninstall命令卸载服务。
// 安装服务
InstallUtil.exe /i ServiceName.exe
// 卸载服务
InstallUtil.exe /u ServiceName.exe
编写服务代码
编写Windows服务需要继承ServiceBase类,并重写OnStart和OnStop方法。
using System;
using System.ServiceProcess;
namespace MyService
{
public class MyService : ServiceBase
{
protected override void OnStart(string[] args)
{
// 在此处编写服务启动代码
}
protected override void OnStop()
{
// 在此处编写服务停止代码
}
}
}
服务安装器
为了简化服务安装和卸载过程,可以实现一个服务安装器。服务安装器继承自Installer类,并声明ServiceInstaller和ServiceProcessInstaller成员变量。
using System.ComponentModel;
using System.Configuration.Install;
using System.ServiceProcess;
namespace MyService
{
[RunInstaller(true)]
public class MyServiceInstaller : Installer
{
private ServiceInstaller serviceInstaller;
private ServiceProcessInstaller processInstaller;
public MyServiceInstaller()
{
// 初始化ServiceInstaller
serviceInstaller = new ServiceInstaller();
serviceInstaller.ServiceName = "MyService";
serviceInstaller.DisplayName = "My Custom Service";
// 初始化ServiceProcessInstaller
processInstaller = new ServiceProcessInstaller();
processInstaller.Account = ServiceAccount.LocalSystem;
// 添加Installer
Installers.Add(serviceInstaller);
Installers.Add(processInstaller);
}
}
}
将服务代码和服务安装器组合在一起,就可以在Visual Studio的设计视图中安装和卸载服务。
示例
以下是两个使用ServiceBase类的示例代码:
1. 监听端口
在Windows服务中监听端口,并在接收到请求时打印请求内容。
using System;
using System.Net;
using System.Net.Sockets;
using System.ServiceProcess;
using System.Text;
namespace MyTcpListener
{
public class TcpListenerService : ServiceBase
{
private TcpListener listener;
protected override void OnStart(string[] args)
{
listener = new TcpListener(IPAddress.Any, 8080);
listener.Start();
listener.BeginAcceptTcpClient(AcceptCallback, listener);
}
protected override void OnStop()
{
listener.Stop();
}
private void AcceptCallback(IAsyncResult result)
{
TcpListener listener = (TcpListener)result.AsyncState;
TcpClient client = listener.EndAcceptTcpClient(result);
byte[] buffer = new byte[1024];
NetworkStream stream = client.GetStream();
int count = stream.Read(buffer, 0, buffer.Length);
string message = Encoding.UTF8.GetString(buffer, 0, count).TrimEnd('\0');
Console.WriteLine("Received message: {0}", message);
stream.Close();
client.Close();
listener.BeginAcceptTcpClient(AcceptCallback, listener);
}
}
}
2. 监控文件夹
在Windows服务中监控文件夹,当文件夹中有新文件时打印文件名和时间戳。
using System;
using System.IO;
using System.ServiceProcess;
namespace MyFileWatcher
{
public class FileWatcherService : ServiceBase
{
private FileSystemWatcher watcher;
protected override void OnStart(string[] args)
{
watcher = new FileSystemWatcher();
watcher.Path = @"C:\MyFolder";
watcher.NotifyFilter = NotifyFilters.FileName | NotifyFilters.CreationTime;
watcher.Created += new FileSystemEventHandler(FileCreated);
watcher.EnableRaisingEvents = true;
}
protected override void OnStop()
{
watcher.Dispose();
}
private void FileCreated(object sender, FileSystemEventArgs e)
{
Console.WriteLine("{0} created at {1}", e.Name, e.ChangeType);
}
}
}
在这两个示例中,OnStart方法用于启动服务,并在服务已启动时开始监听端口或监控文件夹;OnStop方法用于停止服务,并在服务已停止时关闭端口监听器或停止文件夹监控。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#操作Windows服务类System.ServiceProcess.ServiceBase - Python技术站