Windows Service开发介绍
创建服务
1、选择新建->项目->Windows桌面,选择Windows服务。
2、输入名称,单击"确定"。
注意事项:如果在模板中没有Windws服务,可能是未安装.NET桌面开发,可以通过选择左下角打开Visual Studio选择安装程序,选择.NET桌面开发安装。
重命名服务
1、服务创建好,默认名称是Service1.cs,根本实际业务改为匹配的名称,修改名称过程中,会提示"即将重命名文件。是否也对此项目中对代码元素“Service1
”的所有引用执行重命名操作?",点击"是"。
2、双击服务,在"设计"视图中,右击"属性",在属性窗口中把ServiceName的值更改为刚才修改的名字。
编写业务
在"设计"视图中,点击"切换到代码视图",可以看到,此类继承了ServiceBase
。
代码默认重写有OnStart和OnStop两个方法,用于启动和停止服务对组件的处理。
/// <summary>
/// 启动
/// </summary>
/// <param name="args"></param>
protected override void OnStart(string[] args)
{
Log4netHelper.Info("Demo Service启动");
// TODO 业务处理
}
/// <summary>
/// 停止
/// </summary>
protected override void OnStop()
{
Log4netHelper.Info("Demo Service停止");
}
还可以重写 OnPause、OnContinue 和 OnShutdown 方法来定义对组件的其他处理。
支持通过EventLog写入事件日志,需要在"serviceProcessInstaller1"中的Account设置为LocalSystem。
注意事项:不推荐使用此帐户,因为权限过大,推荐使用LocalSerice帐户。
轮询
通过Timer组件来实现此功能。
示例:
/// <summary>
/// 启动
/// </summary>
/// <param name="args"></param>
protected override void OnStart(string[] args)
{
Log4netHelper.Info("Demo Service启动");
Timer timer = new Timer();
timer.Interval = 60000; // 60 秒
timer.Elapsed += new ElapsedEventHandler(this.OnTimer);
timer.Start();
}
/// <summary>
/// 定时器事件
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
public void OnTimer(object sender, ElapsedEventArgs args)
{
// TODO 业务处理
Log4netHelper.Info("Timer执行");
}
添加安装程序
1、添加安装程序
双击服务名称,在"设计"视图中右击,选择添加安装程序。
Visual Studio会向项目中添加一个名为ProjectInstaller组件,其中会包含两个安装程序。
2、配置安装程序
在ProjectInstaller的"设计"视图中,选择"serviceProcessInstaller1",右击选择属性,配置参数:
- Account设置为LocalService。
在ProjectInstaller的"设计"视图中,选择"serviceInstaller1",右击选择属性,配置参数:
- Account设置为LocalService。
- Description设置服务描述,此描述在"服务"窗口描述列显示。
- DisplayName设置为Demo服务,此名称可以不同于ServiceName属性,它是系统使用的名称,此名称在"服务"窗口名称列显示。
- ServiceName设置为DemoService,和服务类名称保持一致。
- StartType设置为Automatic,自启动。
3、添加自启动程序
在StartType设置为Automatic,并不能达到程序安装后启动,需要在`ProjectInstaller.cs`中增加代码。
/// <summary>
/// Ctor
/// </summary>
public ProjectInstaller()
{
InitializeComponent();
// 安装后自启动
this.Committed += new InstallEventHandler(ProjectInstaller_Committed);
}
/// <summary>
/// 安装后发生事件,启动服务
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ProjectInstaller_Committed(object sender, InstallEventArgs e)
{
System.ServiceProcess.ServiceController controller = new System.ServiceProcess.ServiceController("DemoService");
controller.Start();
}
注意事项:ServiceController构造函数接收向系统标识该服务的名称, 也可以是服务的显示名称。
安装服务
使用InstallUtil.exe安装,启用Cmd或Windows PowerShell输入安装命令。
注意事项:Cmd或Windows PowerShell必须使用管理员模式打开。
1、安装
-
32位.NET Framework4或4.5以及更高版本。
安装:C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe 文件所在完整路径\DemoService.exe
卸载:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe /u 文件所在完整路径\DemoService.exe
-
64位.NET Framework4或4.5以及更高版本。
安装:C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe 文件所在完整路径\DemoService.exe
卸载:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /u 文件所在完整路径\DemoService.exe
2、效果
调试
由于服务的特殊性,无法直接启动调试,可以通过附加进行的方式进行调整。
1、附加进程
通过Visual Studio"调试"选择"附加到进程"。
2、选择服务进程
在进程中找到对应的服务。
3、效果
注意事项:
1、附加进程调试,Visual Studio必须以管理员权限打开。
2、如果在附加进程中看不到服务,确认"显示所有用户的进程"是否已勾选。
3、服务正常运行时,程序重新编译会失败,必须停止服务才能编译。
作者:Mr S.R Lee
出处:http://www.cnblogs.com/LeeYongze
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.