.net手动编写Windows服务
1,打开VS,新建一个windows服务程序。项目名称自定义,我这里用的默认名称:Service1

2,打开Service1,按F7查看代码。代码里有三个方法:public Service1()、protected override void OnStart(string[] args)、protected override void OnStop(),
分别是构造函数,服务启动方法,服务停止方法
3,定义一个timer定时器,设置一段时间自动执行:
System.Timers.Timer timer1; //计时器
timer1 = new System.Timers.Timer();
            timer1.Interval = 3000;  //设置计时器事件间隔执行时间
            timer1.Elapsed += new System.Timers.ElapsedEventHandler(timer1_Elapsed);
            timer1.Enabled = true;
4,编写服务具体执行的业务,这里是模拟的,就只写了一个txt文档,并且把写txt文档的方法放到了定时器的自动执行方法里
/// <summary>
        /// 执行的事件
        /// </summary>
        /// <param name="obj"></param>
        private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
    using (FileStream stream = new FileStream(filePath, FileMode.Append))
    using (StreamWriter writer = new StreamWriter(stream))
    {
        writer.WriteLine(DateTime.Now + ",自动服务的执行。。。");
    }
        }
5,编译一下,无编译错误即可。完整的代码如下:
public partial class Service1 : ServiceBase
    {
        System.Timers.Timer timer1;  //计时器
        string filePath = @"D:\MyServiceLog.txt";
public Service1()
        {
            InitializeComponent();
        }
protected override void OnStart(string[] args)
        {
            timer1 = new System.Timers.Timer();
            timer1.Interval = 3000;  //设置计时器事件间隔执行时间
            timer1.Elapsed += new System.Timers.ElapsedEventHandler(timer1_Elapsed);
            timer1.Enabled = true;
using (FileStream stream = new FileStream(filePath, FileMode.Append))
            using (StreamWriter writer = new StreamWriter(stream))
            {
                writer.WriteLine(DateTime.Now + ",服务启动!");
            }
        }
protected override void OnStop()
        {
            this.timer1.Enabled = false;
using (FileStream stream = new FileStream(filePath, FileMode.Append))
            using (StreamWriter writer = new StreamWriter(stream))
            {
                writer.WriteLine(DateTime.Now + ",服务停止!");
            }
        }
/// <summary>
        /// 执行的事件
        /// </summary>
        /// <param name="obj"></param>
        private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            using (FileStream stream = new FileStream(filePath, FileMode.Append))
            using (StreamWriter writer = new StreamWriter(stream))
            {
                writer.WriteLine(DateTime.Now + ",自动服务的执行。。。");
            }
        }
    }
6,在解决方案里双击Service.cs,打开设计器:


在空白处右击,选择“添加安装程序”

点击之后如下

7,查看serviceInstaller1的属性,编辑它的描述信息和服务名称信息,如下:

点击 serviceProcessInstaller1 ,编辑运行次服务的账户类型属性,设置成 LocalSystem,如下:

8,服务配置完成,点击保存,重新生成。
9,下面,我们写一个Windows窗体,用于安装、运行、停止、卸载这个服务:

10,添加一个应用引用,把刚才写的服务引用到这个Windows窗体应用

11,给每个按钮添加相应的代码,完整如下:
public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
string serviceFilePath = System.Environment.CurrentDirectory + "\\WindowsService1.exe";
        string serviceName = "TestWindowsService";
/// <summary>
        /// 安装服务
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            if (this.IsServiceExisted(serviceName)) 
                this.UninstallService(serviceName);
            this.InstallService(serviceFilePath);
        }
        /// <summary>
        /// 启动服务
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            if (this.IsServiceExisted(serviceName)) 
                this.ServiceStart(serviceName);
        }
        /// <summary>
        /// 停止服务
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button3_Click(object sender, EventArgs e)
        {
            if (this.IsServiceExisted(serviceName)) 
                this.ServiceStop(serviceName);
        }
        /// <summary>
        /// 卸载服务
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button4_Click(object sender, EventArgs e)
        {
            if (this.IsServiceExisted(serviceName))
            {
                this.ServiceStop(serviceName);
                this.UninstallService(serviceFilePath);
            }
        }
//判断服务是否存在
        private bool IsServiceExisted(string serviceName)
        {
            ServiceController[] services = ServiceController.GetServices();
            foreach (ServiceController sc in services)
            {
                if (sc.ServiceName.ToLower() == serviceName.ToLower())
                {
                    return true;
                }
            }
            return false;
        }
//安装服务
        private void InstallService(string serviceFilePath)
        {
            using (AssemblyInstaller installer = new AssemblyInstaller())
            {
                installer.UseNewContext = true;
                installer.Path = serviceFilePath;
                IDictionary savedState = new Hashtable();
                installer.Install(savedState);
                installer.Commit(savedState);
            }
        }
//卸载服务
        private void UninstallService(string serviceFilePath)
        {
            using (AssemblyInstaller installer = new AssemblyInstaller())
            {
                installer.UseNewContext = true;
                installer.Path = serviceFilePath;
                installer.Uninstall(null);
            }
        }
        //启动服务
        private void ServiceStart(string serviceName)
        {
            using (ServiceController control = new ServiceController(serviceName))
            {
                if (control.Status == ServiceControllerStatus.Stopped)
                {
                    control.Start();
                }
            }
        }
//停止服务
        private void ServiceStop(string serviceName)
        {
            using (ServiceController control = new ServiceController(serviceName))
            {
                if (control.Status == ServiceControllerStatus.Running)
                {
                    control.Stop();
                }
            }
        }
}
12,编译,运行起来,点击安装服务。然后在计算机管理里,查看所有的服务,就可以找到刚才写的服务了:

.net手动编写Windows服务的更多相关文章
- python实现编写windows服务
		使用python编写windows服务 最近测试服务器上经常发生磁盘空间不足,每次手动清除比较麻烦,所以写个windows服务定时清理下.中间也遇到过几个坑,一起记录下来. 1.python实现win ... 
- C#编写windows服务
		项目要求: 数据库用有一张表,存放待下载文件的地址,服务需要轮训表将未下载的文件下载下来. 表结构如下: 过程: VS--文件-->新建项目-->windows-->windows服 ... 
- 使用C语言编写windows服务一般框架
		原文:使用C语言编写windows服务一般框架 编写windows服务和编写windows应用程序一样,有一些回调函数必须填写且向windows 服务管理器(service manager)进行注册, ... 
- C#编写Windows 服务
		C#编写Windows 服务 Microsoft Windows 服务(即,以前的 NT 服务)使您能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序.这些服务可以在计算机启动时 ... 
- C#  编写windows服务及服务的安装、启动、删除、定时执行任务
		一.编写windows服务 1.VS2017 - 创建服务Myservice 2.创建好项目之后 --- >> 双击 Service1.cs ---- >> 出现一个设计 ... 
- c# 编写windows 服务,并制作安装包
		对服务的认识有很多个阶段. 第一阶段:当时还在用c++,知道在一个进程里while(True){},然后里面做很多很多事情,这就叫做服务了,界面可能当时还用Console控制台程序. 第二阶段:知道了 ... 
- 手把手教用C#编写Windows服务 并控制服务 安装、启动、停止、卸载
		Windows服务 Microsoft Windows 服务(即,以前的 NT 服务)使您能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序.这些服务可以在计算机启动时自动启动, ... 
- 第八篇--编写Windows服务
		编写service服务参考网址:https://blog.csdn.net/nodeathphoenix/article/details/24181509 vc获得显示器状态(捕获息屏.亮屏网址):h ... 
- 编写Windows服务疑问1:操作过程
		Windows 服务开发平时不太受人关注,毕竟那是高大上的项目类型,平常需求也用不上,很多老掉牙的家伙也只知有WinForm,仍不知有WPF,更别说Windows 服务了,正如陶渊明所写的,“不知有汉 ... 
随机推荐
- strapi 开源api && 内容管理平台试用
			strapi 是一个开源的api && 内容管理平台,功能操作起来还是比较方便简单的. 安装 使用docker && docker-compose 代码clone gi ... 
- oracle10g精简版安装步骤
			 Feng218 假设出现例如以下错误: 最好把360安全卫士全关了.再安装下.就没事了 然后安装完了进入时输入username:sys或者system password就是自己设好的passwo ... 
- StringUtils.isEmpty()和isBlank()的区别
			一.概述 两种判断字符串是否为空的用法都是在程序开发时常用的,相信不少同学在这种简单的问题上也吃过亏,到底有什么区别,使用有什么讲究,带着问题往下看. 二.jar包 commons-lang3-3.5 ... 
- sql语句学习(第二季
			union操作符 -- 4.查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩 -- (包括有成绩的和无成绩的) 两个表联查的时候,有时候一个表在另一个表没有数据,即使使用了join,还是nu ... 
- 使用ntp从时间同步服务器更新centos系统时间的方法
			CentOS系统时间同步的步骤如下: 复制代码 代码如下: cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtimentpdate us.pool.ntp ... 
- Intellij Idea上Spring Boot编译报错:Error:(3, 32) java: 程序包org.springframework.boot不存在
			很尴尬,为了使用Spring Boot的Initializr,特意下了个Intellij Idea,刚按提示新建一个Spring Boot的Maven项目后,就出现红叉叉了.因为IDE是新的,开始是M ... 
- DllMain 用法
			1.1 DllMain简介 跟exe有个main或者WinMain入口函数一样,DLL也有一个入口函数,就是DllMain.以“DllMain”为关键字,来看看MSDN帮助文档怎么介绍这个函数的. ... 
- C++ 内连接与外连接 (转)
			啥叫内连接 外连接 我们知道编译的时候(假如编译器是VS),是以源文件cpp文件为单位,编译成一个个的obj文件,然后再通过链接器把不同的obj文件链接起来. 简单的说,如果一些变量或函数的定义是内连 ... 
- Log4j(3)--rootLogger根配置和appender输出类型配置
			参考博客:http://blog.java1234.com/blog/articles/270.html 一.rootLogger根配置: Log4j 根配置语法 log4j.rootLogger = ... 
- libevent源码学习
			怎么快速学习开源库比如libevent? libevent分析 - sparkliang的专栏 - 博客频道 - CSDN.NET Libevent源码分析 - luotuo44的专栏 - 博客频道 ... 
