下面我来为您讲解如何使用C#创建Windows服务的完整攻略,包含两条示例说明。
创建Windows服务的步骤
1. 创建一个空的Windows服务项目
在Visual Studio中选择File -> New -> Project,然后在模板中选择Visual C#->Windows Desktop->Windows服务。
2. 添加需要的命名空间
在项目中添加需要的命名空间:
using System.ServiceProcess;
3. 继承ServiceBase类
在项目中创建一个类,然后继承ServiceBase类:
public partial class MyService : ServiceBase
{
public MyService()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
// 在服务开始时执行的代码
}
protected override void OnStop()
{
// 在服务停止时执行的代码
}
}
4. 安装服务
可以使用命令行安装程序installutil.exe来安装服务。命令为:
installutil.exe /i MyService.exe
5. 可选:使用安装程序
我们可以使用Visual Studio来创建一个安装程序。创建Install类,继承Installer类,在构造函数中添加ServiceProcessInstaller和ServiceInstaller。
[RunInstaller(true)]
public class Install : Installer
{
private ServiceProcessInstaller process;
private ServiceInstaller service;
public Install()
{
process = new ServiceProcessInstaller();
process.Account = ServiceAccount.LocalSystem;
service = new ServiceInstaller();
service.ServiceName = "MyService";
service.Description = "A simple Windows service for demonstration purposes.";
service.StartType = ServiceStartMode.Automatic;
Installers.Add(process);
Installers.Add(service);
}
}
然后右击Install.cs文件,在属性窗口中将Build Action设置为Compile。然后重新编译项目。
6. 启动服务
可以在Windows服务管理器中启动或停止服务。它位于控制面板->管理工具->服务。
示例1:打印“Hello World”
下面是一个简单的示例,为Windows服务添加一个计时器,在计时器每次执行时打印“Hello World”到事件日志。
public partial class MyService : ServiceBase
{
private Timer timer = null;
public MyService()
{
InitializeComponent();
eventLog1 = new EventLog();
if (!EventLog.SourceExists("MySource"))
{
EventLog.CreateEventSource("MySource", "MyNewLog");
}
eventLog1.Source = "MySource";
eventLog1.Log = "MyNewLog";
}
protected override void OnStart(string[] args)
{
eventLog1.WriteEntry("In OnStart");
timer = new Timer();
timer.Interval = 60000; // 60 seconds
timer.Elapsed += new ElapsedEventHandler(this.OnTimer);
timer.Start();
}
protected override void OnStop()
{
eventLog1.WriteEntry("In OnStop");
timer.Stop();
timer.Dispose();
}
private void OnTimer(Object source, ElapsedEventArgs e)
{
eventLog1.WriteEntry("Hello World");
}
}
上面的代码演示了如何创建一个计时器,并在计时器每次执行时打印“Hello World”到事件日志中。
示例2: 监控一个目录中的文件变化
下面是另一个示例,监控一个目录中的文件变化,并将变化记录到事件日志中。
public partial class MyService : ServiceBase
{
private FileSystemWatcher watcher = null;
public MyService()
{
InitializeComponent();
eventLog1 = new EventLog();
if (!EventLog.SourceExists("MySource"))
{
EventLog.CreateEventSource("MySource", "MyNewLog");
}
eventLog1.Source = "MySource";
eventLog1.Log = "MyNewLog";
}
protected override void OnStart(string[] args)
{
eventLog1.WriteEntry("In OnStart");
watcher = new FileSystemWatcher();
watcher.Path = @"C:\MyFolder";
watcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName;
watcher.Filter = "*.*";
watcher.Changed += new FileSystemEventHandler(this.OnChanged);
watcher.Created += new FileSystemEventHandler(this.OnChanged);
watcher.Deleted += new FileSystemEventHandler(this.OnChanged);
watcher.Renamed += new RenamedEventHandler(this.OnRenamed);
watcher.EnableRaisingEvents = true;
}
protected override void OnStop()
{
eventLog1.WriteEntry("In OnStop");
watcher.EnableRaisingEvents = false;
watcher.Dispose();
}
private void OnChanged(Object source, FileSystemEventArgs e)
{
eventLog1.WriteEntry("File: " + e.FullPath + " " + e.ChangeType + "!");
}
private void OnRenamed(Object source, RenamedEventArgs e)
{
eventLog1.WriteEntry("File: " + e.OldFullPath + " renamed to " + e.FullPath + ".");
}
}
上面的代码演示了如何使用FileSystemWatcher来监控一个目录中的文件变化,并将变化记录到事件日志中。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#创建Windows服务的实现方法 - Python技术站