参考网址: https://www.cnblogs.com/wenlong512/p/7355971.html

一、简介

  程序创建在 Windows 会话中,可长时间运行的可执行应用程序。这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面。这些功能使服务非常适合在服务器上使用,需要使用时不会影响在同一台计算机上工作的其他用户的功能。还可以在不同于登录用户的特定用户帐户或默认计算机帐户的安全上下文中运行服务。说白了就是在windows后台运行,计算机自己跑的后台程序。

二、demo建立

  1)新建一个Windows服务WindowsServiceDemo如下图,win10,vs2013.

    

  2)更改项目启动项。Program.cs中修改 new ServiceBase 构造函数,首页构造出 MainService.cs 为首页。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        static void Main()
        {
            ServiceBase[] ServicesToRun;
            ServicesToRun = new ServiceBase[]
            {
                new MainService()
            };
            ServiceBase.Run(ServicesToRun);
        }
    }

  3)创建2)中的首页MainService,并在该类构造函数初化.net(InitializeComponent()),初始化Windows服务程序(InitService())。windows服务初始化时候会调用StartThread()开始任务,StartThread()调用MessageAdd日志记录,MessageAdd调用FileClass文件助手类,fileClass中会有具体的文件夹建立,文件的增删改,以及具体文件的增加日期功能。

    OnStart :服务启动的时候执行,

    OnStop:服务停止的时候执行

    MainService.cs如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
using System;
using System.ServiceProcess;
using System.Timers;
 
namespace WindowsServiceDemo
{
    partial class MainService : ServiceBase
    {
         
        private static object syncRoot = new Object();//同步锁
        public static string serviceName = "Windows服务程序";
        FileClass fileClass = new FileClass();
        System.Timers.Timer tim;
        private string logPath = System.Windows.Forms.Application.StartupPath + @"\Log";//日志文件路径
         
 
#region 公共设置
 
        public MainService()
        {
            //.net初始化
            InitializeComponent();
            InitService();
        }
#endregion
 
        protected override void OnStart(string[] args)
        {
            try
            {
                this.tim.Enabled = true;
                this.tim.Start();
            }
            catch (Exception ex)
            {
                MessageAdd("OnStart错误:" + ex.Message);
            }
            MessageAdd(serviceName + "已成功启动!");
 
        }
 
        protected override void OnStop()
        {
            try
            {
                this.tim.Stop();
            }
            catch (Exception ex)
            {
                MessageAdd("OnStop错误:" + ex.Message);
            }
            MessageAdd(serviceName + "已停止!");
         
        }
        protected override void OnContinue()
        {
            this.tim.Start();
            base.OnContinue();
        }
 
        protected override void OnPause()
        {
            this.tim.Stop();
            base.OnPause();
        }
 
 
        /// <summary>
        /// 初始化服务参数
        /// </summary>
        private void InitService()
        {
            CanShutdown = true;
            CanStop = true;
            CanPauseAndContinue = true;
            ServiceName = MainService.serviceName;
            AutoLog = false;//为了使用自定义日志,必须将 AutoLog 设置为 false
 
            tim = new System.Timers.Timer();
            tim.Elapsed += new ElapsedEventHandler(tim_Elapsed);
            tim.Interval = 5000;
            tim.AutoReset = true;
        }
        private void tim_Elapsed(object sender, EventArgs e)
        {
            StartThread();
        }
 
        /// <summary> 
        /// 开始任务
        /// </summary> 
        private void StartThread()
        {
            MessageAdd(serviceName + " " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
        }
 
        /// <summary> 
        ///  日志记录
        /// </summary> 
        /// <param name="serviceName">内容</param> 
        public void MessageAdd(string str)
        {
            try
            {
                fileClass.WriteLogFile(logPath, str);//写入记录日志
            }
            catch(Exception e)
            {
                return;
            }
        }
    }
}

  4)MainService.cs中调用了类fileClass.cs来对文件的具体操作

  FileClass.cs如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
using System;
using System.IO;
 
namespace WindowsServiceDemo
{
    class FileClass
    {
        //说白了就是增加文件夹,增删改文件,增加文件内容
        //创建文件夹
        public bool CreateFolder(string path)
        {
            try
            {
                if (Directory.Exists(path))
                {
                    return true;
                }
                if (!Directory.Exists(path.Substring(0, path.LastIndexOf("\\"))))
                {
                    //若路径中无“\”则表示路径错误
                    return false;
                }
                else
                {
                    //创建文件
                    DirectoryInfo dirInfo = Directory.CreateDirectory(path);
                    return true;
                }
 
            }
            catch (Exception)
            {
 
                return false;
            }
 
        }
 
        //创建文件
        public void CreateFile(string path)
        {
            try
            {
                if (CreateFolder(path.Substring(0, path.LastIndexOf("\\"))))
                {
                    if (!File.Exists(path))
                    {
                        FileStream fs = File.Create(path);
                        fs.Close();
                    }
                }
                else
                {
                    return;
 
                }
            }
            catch (Exception e)
            {
                return ;
            }
        }
 
        //删除文件
        public void DeleceFile(string path)
        {
            try
            {
                if (!File.Exists(path))
                {
                    return;
                }
                else
                {
                    File.Delete(path);
                }
            }
            catch (Exception ex)
            {
                return;
            }
        }
 
 
 
        //写文件
        public void WriteFile(string path, string content)
        {
            try
            {
                if (!File.Exists(path))
                {
                    CreateFile(path);
                }
                FileStream fs = new FileStream(path, FileMode.Append, FileAccess.Write);
                StreamWriter sw = new StreamWriter(fs);
                sw.WriteLine(content);
                sw.Close();
            }
            catch (Exception exception)
            {
                return;
            }
        }
 
        /// <summary>
        /// 将即时日志保存入日志文件
        /// </summary>
        /// <param name="directoryPath"></param>
        /// <param name="content"></param>
        public void WriteLogFile(string directoryPath, string content)
        {
            if (!Directory.Exists(directoryPath))
            {
                CreateFolder(directoryPath);
            }
            try
            {
                //写入新的文件
                string filePath = directoryPath + "\\" + DateTime.Now.ToString("yyyyMMdd" ".log");
                FileStream fs = new FileStream(filePath, FileMode.Append, FileAccess.Write);
                StreamWriter sw = new StreamWriter(fs);
                sw.WriteLine(content);
                sw.Close();
                fs.Close();;
            }
            catch (Exception)
            {
                return;
            }
        }
 
    }
}

  在这个类的编写中会遇到缺少引用的编译错误,在引用中添加System.Windows.Forms该引用在框架中查找,而并非在扩展中

  5)完成上述步骤以后项目就可以编译通过了。然后进行项目部署。

  6)左键双击MainService.cs也就是上边说的首页,然后在空白的地方右键

    点击“添加安装程序”。自动生成ProjectInstaller.cs。进入ProjectInstaller.cs按下图编辑两个插件的属性

    保存更改。

  7)然后以管理员进入cmd 输入:  C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe "D:\visual studio 2013\Projects\WindowsServiceDemo\WindowsServiceDemo\bin\Debug\WindowsServiceDemo.exe" 回车,安装成功

  8)输入:  C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe /u "D:\visual studio 2013\Projects\WindowsServiceDemo\WindowsServiceDemo\bin\Debug\WindowsServiceDemo.exe"

    C:\WINDOWS\system32>C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe 是在程序部署时候需要依赖一个.net程序集,我是默认安装在c盘下,找到该安装程序   工具。

    D:\visual studio 2013\Projects\WindowsServiceDemo\WindowsServiceDemo\bin\Debug\WindowsServiceDemo.exe 是我的项目所在位置进入bin下..

    如果不是管理员登入cmd则会报错如下windows服务没有RunInstallerAttribute.Yes的公共安装程序

  10)cmd services.msc 进入win服务,开启“Windows服务Demo”服务

    去D:\visual studio 2013\Projects\WindowsServiceDemo\WindowsServiceDemo\bin\Debug\Log下找日志文件。打开以后是这个样子的,程序正确运行

   11)启动调试功能

    打开服务,管理员运行vs进入 “工具” > “添加到附加进程”,选择项目进程,设置断点可以调试。

三、总结及注意事项

  

    整个项目文件,Service1.cs是废弃的首页,下图错误,从新配图

    服务如上。

    

    displayName是在服务中显示的名字,进程是那个安装包儿的名字,也就是.exe文件

    项目源码:http://pan.baidu.com/s/1ge7bWIJ

 

WindowsService开发简单入门的更多相关文章

  1. seaJs模块化开发简单入门

    随着前端技术的日益成熟,功能越来越丰富强大,规范也越来越健全,在这样的背景环境下很快便有了CommonJs.AMD.CMD等一系列规范,使前端发开趋向模块化.规范化.CMD模块化的代表之一就是国内开发 ...

  2. Java微信服务号的开发(简单入门)

    进行微信服务号开发的步骤 一个别人已经搭建好的项目参考地址:下载链接 1.搭建微信服务号的服务器 项目配置maven <dependency> <groupId>com.soe ...

  3. flink--DateSet开发--简单入门

    开发流程 1. 获得一个execution environment, 2. 加载/创建初始数据, 3. 指定这些数据的转换, 4. 指定将计算结果放在哪里, 5. 触发程序执行 例子: object ...

  4. 【java开发系列】—— spring简单入门示例

    1 JDK安装 2 Struts2简单入门示例 前言 作为入门级的记录帖,没有过多的技术含量,简单的搭建配置框架而已.这次讲到spring,这个应该是SSH中的重量级框架,它主要包含两个内容:控制反转 ...

  5. [Intel Edison开发板] 02、Edison开发板入门

    一.前言 Start from the link: 开始学习的链接 上面链接是官网的教程,按照教程可以开发板入门: 其中第一步是了解开发板,涉及到如何组装.如何连线.一些主要的接口简单介绍等信息: 第 ...

  6. [原创]MYSQL的简单入门

    MYSQL简单入门: 查询库名称:show databases; information_schema mysql test 2:创建库 create database 库名 DEFAULT CHAR ...

  7. 使用scala开发spark入门总结

    使用scala开发spark入门总结 一.spark简单介绍 关于spark的介绍网上有很多,可以自行百度和google,这里只做简单介绍.推荐简单介绍连接:http://blog.jobbole.c ...

  8. Okio 1.9简单入门

    Okio 1.9简单入门 Okio库是由square公司开发的,补充了java.io和java.nio的不足,更加方便,快速的访问.存储和处理你的数据.而OkHttp的底层也使用该库作为支持. 该库极 ...

  9. HealthKit开发快速入门教程之HealthKit数据的操作

    HealthKit开发快速入门教程之HealthKit数据的操作 数据的表示 在HealthKit中,数据是最核心的元素.通过分析数据,人们可以看到相关的健康信息.例如,通过统计步数数据,人们可以知道 ...

随机推荐

  1. ARC 122 简要题解

    ARC 122 简要题解 传送门 A - Many Formulae 考虑对于每个数分别算其贡献. 通过枚举该数前面的符号,借助一个非常简单的 \(\mathrm{DP}\)(\(f_{i,0/1}\ ...

  2. 「POJ3436」ACM Computer Factory题解

    题意: 有很多台机器,可以把物件从一种状态改装成另一种状态,初始全为\(0\),最终状态全为\(1\),让你可以拼凑机器,请问最大总性能为多少,且要求输出方案. 题解: 这道题是真的水啊,我不想写太多 ...

  3. java 实现中英文拼写检查和错误纠正?可我只会写 CRUD 啊!

    简单的需求 临近下班,小明忙完了今天的任务,正准备下班回家. 一条消息闪烁了起来. "最近发现公众号的拼写检查功能不错,帮助用户发现错别字,体验不错.给我们系统也做一个." 看着这 ...

  4. (Opencv02)图片展示

    (Opencv02)图片展示 在程序里我们怎么把图片显示出来呢? 这里需要记一个自定义函数就好啦!  def cv_show(name, img):     cv2.imshow(name, img) ...

  5. 阿里云RocketMQ定时/延迟消息队列实现

    新的阅读体验:http://www.zhouhong.icu/post/157 一.业务需求 需要实现一个提前二十分钟通知用户去做某件事的一个业务,拿到这个业务首先想到的最简单得方法就是使用Redis ...

  6. QML用同一模版多开主窗口

    如何动态地创建多个长的一样的主窗口哪(数据当然不一样), 用QML也是可以实现的. 简单的地说, 就是调用多次load即可. QCoreApplication::setAttribute(Qt::AA ...

  7. Lambda--Optional、Collectors高级进阶方法

    Lambda--Collectors.optional高级使用 偶然看到了同事groupingBy用法,然后百度衍生出了optional,collectors,map等各种用法.突然发现自己之前写的代 ...

  8. 洛谷P1377题解

    题面 首先他叫我们建一颗笛卡尔树,所以我们就建一颗笛卡尔树. 然后他说要生成序列中最小的.想到笛卡尔树的一条性质:左<根<右.但是根节点必须先插进去.他的两个儿子用贪心的思想就知道是先选左 ...

  9. UI_UE在线就业班(2)(Adobe Illustrator软件学习)

    Adobe Illustrator软件的使用     认识AIUI_UE在线就业班(2) .   ▼ AI是Adobe Illustrator的英文缩写,是Adobe公司旗下推出的一款基于矢量图形制作 ...

  10. 针对不同场景的Python合并多个Excel方法

    大家好,我是辰哥~ 在辰哥看来,技术能够减少繁琐工作带来的枯燥,技术+实际=方便.最近辰哥也是在弄excel文件的时候发现手动去整理有点繁琐枯燥,想着技术可以代替我去处理这部分繁琐的工作那何乐而不为呢 ...