C#编写Windows服务程序图文教程-程序员宅基地

技术标签: .NET开发  windows服务  

Windows Service这一块并不复杂,但是注意事项太多了,网上资料也很凌乱,偶尔自己写也会丢三落四的。所以本文也就产生了,本文不会写复杂的东西,完全以基础应用的需求来写,所以不会对Windows Service写很深入。

本文介绍了如何用C#创建、安装、启动、监控、卸载简单的Windows Service 的内容步骤和注意事项。

一、创建一个Windows Service

1)创建Windows Service项目

2)对Service重命名

将Service1重命名为你服务名称,这里我们命名为ServiceTest。

二、创建服务安装程序

1)添加安装程序

之后我们可以看到上图,自动为我们创建了ProjectInstaller.cs以及2个安装的组件。

2)修改安装服务名

右键serviceInsraller1,选择属性,将ServiceName的值改为ServiceTest。

3)修改安装权限

右键serviceProcessInsraller1,选择属性,将Account的值改为LocalSystem。

三、写入服务代码

1)打开ServiceTest代码

右键ServiceTest,选择查看代码。

2)写入Service逻辑

添加如下代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;

namespace WindowsServiceTest
{
	public partial class ServiceTest : ServiceBase
	{
		public ServiceTest()
		{
			InitializeComponent();
		}

		protected override void OnStart(string[] args)
		{
			using (System.IO.StreamWriter sw = new System.IO.StreamWriter("C:\\log.txt", true))
			{
				sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ") + "Start.");
			}
		}

		protected override void OnStop()
		{
			using (System.IO.StreamWriter sw = new System.IO.StreamWriter("C:\\log.txt", true))
			{
				sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ") + "Stop.");
			}
		}
	}
}

这里我们的逻辑很简单,启动服务的时候写个日志,关闭的时候再写个日志。

四、创建安装脚本

在项目中添加2个文件如下(必须是ANSI或者UTF-8无BOM格式):

1)安装脚本Install.bat

%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe WindowsServiceTest.exe
Net Start ServiceTest
sc config ServiceTest start= auto

2)卸载脚本Uninstall.bat

%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe /u WindowsServiceTest.exe

3)安装脚本说明

第二行为启动服务。

第三行为设置服务为自动运行。

这2行视服务形式自行选择。

4)脚本调试

如果需要查看脚本运行状况,在脚本最后一行加入pause

五、在C#中对服务进行控制

0)配置目录结构

简历一个新WPF项目,叫WindowsServiceTestUI,添加对System.ServiceProcess的引用。

在WindowsServiceTestUI的bin\Debug目录下建立Service目录。

将WindowsServiceTest的生成目录设置为上面创建的Service目录。

生成后目录结构如下图

1)安装

安装时会产生目录问题,所以安装代码如下:

string CurrentDirectory = System.Environment.CurrentDirectory;
System.Environment.CurrentDirectory = CurrentDirectory + "\\Service";
Process process = new Process();
process.StartInfo.UseShellExecute = false;
process.StartInfo.FileName = "Install.bat";
process.StartInfo.CreateNoWindow = true;
process.Start();
System.Environment.CurrentDirectory = CurrentDirectory;

2)卸载

卸载时也会产生目录问题,所以卸载代码如下:

string CurrentDirectory = System.Environment.CurrentDirectory;
System.Environment.CurrentDirectory = CurrentDirectory + "\\Service";
Process process = new Process();
process.StartInfo.UseShellExecute = false;
process.StartInfo.FileName = "Uninstall.bat";
process.StartInfo.CreateNoWindow = true;
process.Start();
System.Environment.CurrentDirectory = CurrentDirectory;

3)启动

代码如下:

using System.ServiceProcess;


ServiceController serviceController = new ServiceController("ServiceTest");
serviceController.Start();

4)停止

ServiceController serviceController = new ServiceController("ServiceTest");
if (serviceController.CanStop)
	serviceController.Stop();

5)暂停/继续

ServiceController serviceController = new ServiceController("ServiceTest");
if (serviceController.CanPauseAndContinue)
{
	if (serviceController.Status == ServiceControllerStatus.Running)
		serviceController.Pause();
	else if (serviceController.Status == ServiceControllerStatus.Paused)
		serviceController.Continue();
}

6)检查状态

ServiceController serviceController = new ServiceController("ServiceTest");
string Status = serviceController.Status.ToString();

六、调试Windows Service

1)安装并运行服务

2)附加进程

3)在代码中加入断点进行调试

七、总结

本文对Windows service的上述配置都未做详细解释,但是按上述步骤就可以制作可运行的Windows Service,从而达到了工作的需求。




windows服务安装




选择添加安装程序.此时生成一个文件ProjectInstaller.cs,双击该文件进入了设计界面,

image

image

右键serviceInstaller1出现如上弹出菜单选择属性.打开属性对话框可以看到ServiceName属性,这个就是我们生成的windows服务的名称.StartType指定服务启动类型如自动、手动、禁用.

接下来我们查看并设置serviceProcessInstaller1的属性,Account属性指定用户类型,这里用的是NetworkService用户,具体用什么用户可以去msdn了解详细.

现在我们新建一个安装程序项目

image

image

右键Setup=>添加=》项目输出,出现如下界面

image

点击确定.然后 Setup右键=>视图=>自定义操作,如下图

image

出现如下

image

自定义操作右键=》添加自定义操作

image

image

点击确定,然后选择Valorservice

image

点击确定就Ok了.生成Setup这个项目就可生成windows服务的安装包了.

image


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yuhuangc/article/details/27343415

智能推荐

Ubuntu MySQL设置编码_ubuntu设置mysql编码-程序员宅基地

Ubuntu 下MySQL编码设置_ubuntu设置mysql编码

2020-08-31 Python中给文件加锁解锁-程序员宅基地

fcntl模块:flock() : flock(f, operation)operation : 包括:fcntl.LOCK_UN 解锁fcntl.LOCK_EX 排他锁fcntl.LOCK_SH 共享锁fcntl.LOCK_NB 非阻塞锁LOCK_SH 共享锁:所有进程没有写访问权限,即使是加锁进程也没有。所有进程有读访问权限。LOCK_EX 排他锁:除加锁进程外其他进程没...

Linux基础知识学习part1_grep parallel-程序员宅基地

Linux基本操作登录登陆时点击未列出(输入管理员名称:root和密码)可通过管理员登陆虚拟文本控制台又称虚拟终端(tty),Centos操作系统有5个虚拟终端(tty1~tty5)。通过快捷键Ctrl+Alt+(f2~f6)可进行切换。(需重新登录时密码不显示!)Ctrl+Alt+F1切换到图形界面。基本操作管理员打开终端显示 [root@localhost ~] #root:用户名localhost:Linux主机的名字#:当前用户为管理员;$:当前为普通用户查看当_grep parallel

iOS 【NSURLSession 下载文件(解决内存飙升/句柄指针/离线断点续传)】_ios nsurlsession 下载速度慢-程序员宅基地

NSURLSession发请求下载文件(代理)解决内存飙升问题实现下载的断点续传_ios nsurlsession 下载速度慢

自定义控件的使用(.aspx调用.ascx)_aspx demo-程序员宅基地

DemoUserControl.ascx的源 请输入:处理结果: DemoUserControl.ascx.cs的代码using System;using System.Data;using System.Configuration;using System.Collections;using System.Web;using System.W_aspx demo

SRTM DEM hgt格式转成GRID格式的问题解决_dem grid格式-程序员宅基地

SRTM数据主要是由美国太空总署(NASA)和国防部国家测绘局(NIMA)联合测量的,SRTM的全称是Shuttle Radar Topography Mission,即航天飞机雷达地形测绘使命。获取的雷达影像数据经过两年多的处理,制成了数字地形高程模型,该测量数据覆盖中国全境。SRTM数据每经纬度方格提供一个文件,精度有1 arc-second和3 arc-seconds两种,称作SRTM1和S_dem grid格式

随便推点

矩阵光学 matlab,Transfer Matrix Optical Modeling Stanford (传递矩阵光学建模斯坦福).pdf...-程序员宅基地

Transfer Matrix Optical Modeling Stanford (传递矩阵光学建模斯坦福)Transfer Matrix Optical ModelingGeorge F. Burkhard and Eric T. HokeMcGehee Group (Stanford Univ.)March, 2011This document describes, brief...

Dynamic Entity Representation with Max-pooling Improves Machine-程序员宅基地

本文是机器阅读理解系列的第六篇文章,paper的题目是Dynamic Entity Representation with Max-pooling Improves Machine Reading,作者是来自日本东北大学的老师Sosuke Kobayashi,文章发表在NAACL HLT 2016。本文的代码开源在Github。本文模型之前的模型都是用..._entityrepresentation

树莓派简单配置.txt_树莓派上python使用 txt-程序员宅基地

刚上电后 可能需要一段时间才能连接ssh关机 init 0用户名密码Raspberry Pi默认用户是 pi 密码为 raspberry【可直接登入】root root root 123456网络设置192.168.137.8 设置网线ip【不设置会自动分配】 设置网线固定ip方法 在 boot启动盘下 有个cmdline.txt 最前边加一句 ip= xxx...._树莓派上python使用 txt

PMP 项目管理(12)项目采购管理 思维导图 解读_资源采购思维导图-程序员宅基地

系列文章解读&说明:PMBOK(第六版) 项目管理知识体系的解读主要分为以下部分:PMP 项目管理整体架构思维导图 解读PMP 项目管理(01)引论思维导图 解读PMP 项目管理(02)项目运行环境思维导图 解读PMP 项目管理(03)项目经理角色思维导图 解读PMP 项目管理(04)项目整合管理思维导图 解读PMP 项目管理(05)项目范围管..._资源采购思维导图

数据库Navicat建表出现1064错误原因_navicat报错1064-程序员宅基地

在navicat里面建表时出现了以下错误:发现是建表的过程中没有设定参数的长度,设定数据长度后就不会出现这个问题了。_navicat报错1064

WebApi 上传文件并传递参数_web api传递stream参数-程序员宅基地

//检查POST的是否为MultiPart if (!Request.Content.IsMimeMultipartContent()) { throw new HttpResponseException(HttpStatusCode.Unsupported..._web api传递stream参数