C#如何一步步创建Windows 服务(Windows Service Framework版本)项目

C#如何一步步创建Windows 服务(Windows Service)项目

Windows Service项目通常被应用在服务器上,一般没有固定的UI界面,生命周期往往随着Windows系统的开启而开启(当然可设置),随着Windows系统的结束而结束。在工业领域中可以很好的使用它来避免服务器因更新系统重启而带来的软件被迫停止运行问题。

1.新建服务项目

打开VS2019,新建Windows 服务(或Windows Service)项目,输入要创建的项目名和选择所需的Framework版本,点击创建。
在创建好的项目里,你可以点击Service1.cs,按F7进入代码层,
项目
里面有重写的OnStart()方法和OnStop()方法,顾名思义,就是服务开启和结束时要做的一些逻辑,你可以在里面直接码代码,但是一般不建议这么做。
在这里插入图片描述
因为你如果直接在里面写代码逻辑,当你要更改服务逻辑的时候,就得打开这部分代码更改编译完成后,从电脑上先卸载服务,再把新的服务给装上去,比较麻烦。
所以,一般采用服务调dll的形式,将逻辑代码写在dll里面,这样即使要更改逻辑,直接改dll文件就行,改好后直接替换dll文件,可以省去更新安装服务的操作。

2.创建服务逻辑类库

在Solution中新建类库项目,填写项目名称,选择Framework版本。
在这里插入图片描述
里面建ServiceHandler类,类里面包含两个Public 方法ServiceStart()和ServiceStop(),分别被上文提到的OnStart()方法和OnStop()方法调用。ServiceStart()的逻辑很简单,就是建立两个Task,分别向log1.txt和log2.txt里写入当前时间。ServiceStop()方法就是结束掉这两个线程。
代码如下:

public class ServiceHandler
    {
    
    
        private Task task1;
        private Task task2;
        private bool task1_mark;
        private bool task2_mark;
        private string _path1;
        private string _path2;
        public void ServiceStart()
        {
    
    
            _path1 = @"E:\temp\log1.txt";
            _path2 = @"E:\temp\log2.txt";
            if (!File.Exists(_path1))
            {
    
    
                File.Create(_path1);
            }

            if (!File.Exists(_path2))
            {
    
    
                File.Create(_path2);
            }

            task1 = new Task(Task1Haneler);
            task2 = new Task(Task2Haneler);

            task1_mark = true;
            task1.Start();
            Thread.Sleep(2000);
            task2_mark = true;
            task2.Start();
        }

        private void Task1Haneler()
        {
    
    
            while (task1_mark)
            {
    
    

                using (StreamWriter writer = new StreamWriter(_path1))
                {
    
    
                    writer.WriteLine("task1:" + DateTime.Now.ToString());
                    writer.Close();
                }



                Thread.Sleep(1000);
            }
        }
        private void Task2Haneler()
        {
    
    
            while (task2_mark)
            {
    
    

                using (StreamWriter writer = new StreamWriter(_path2))
                {
    
    
                    writer.WriteLine("task2:" + DateTime.Now.ToString());
                    writer.Close();
                }



                Thread.Sleep(2000);
            }
        }

        public void ServiceStop()
        {
    
    
            task1_mark = false;
            task2_mark = false;

        }
    }

3.建立WindowsForm项目,调试写完的类库项目

上文服务的逻辑类库写完后,是不能马上部署的,因为没有调试过。所以可以在solution中建立Windows窗体项目来调试这个类库。
在这里插入图片描述
在创建的窗体中,加入两个按钮,再在引用(Reference)中,添加上步完成的类库。
在这里插入图片描述
在这里插入图片描述
在窗体后台代码中,分别为两个按钮添加Click事件,来调用类库中的ServiceStart()和ServiceStop()方法。

    public partial class Form1 : Form
    {
    
    
        private ServiceHandler _serviceHandler;
        public Form1()
        {
    
    
            InitializeComponent();
            _serviceHandler = new ServiceHandler();
        }

        private void Start_Click(object sender, EventArgs e)
        {
    
    
            _serviceHandler.ServiceStart();
        }

        private void Stop_Click(object sender, EventArgs e)
        {
    
    
            _serviceHandler.ServiceStop();
        }
    }

在界面上点击Start按钮,发现两个log文件中确实在更新时间,点击Stop后,时间停止更新,服务类库的代码顺利调过,下面就可以把它加入服务项目中了。
在这里插入图片描述

4.完成服务项目的编写和配置

首先,同样的,在服务项目中添加逻辑类库。
在这里插入图片描述
在Service1.cs的后台代码中,调用类库中的方法。

    public partial class Service1 : ServiceBase
    {
    
    
        private ServiceHandler _serviceHandler;
        public Service1()
        {
    
    
            InitializeComponent();
            _serviceHandler = new ServiceHandler();
        }

        protected override void OnStart(string[] args)
        {
    
    
            _serviceHandler.ServiceStart();
        }

        protected override void OnStop()
        {
    
    
            _serviceHandler.ServiceStop();
        }
    }

在Service1.cs的设计界面中,property属性的CanStop配置成true。
在这里插入图片描述
再点击ProjectInstaller.cs项目,出现如下界面。
在这里插入图片描述
点击界面上serviceProcessInstaller1,把Property中的Account改成LocalSystem,这可以避开重启时登入账户操作,换句话说,即使Windows没登录,也能开启本服务。
在这里插入图片描述
再点击serviceInstaller1,把Property中的DisplayName和Description填上,他是用来显示在服务管理器上你服务的名字和描述的。同时把StartType改为Automatic,让服务能自启动。
在这里插入图片描述
到这里,服务就配置完了,点击编译,生成服务程序。
在这里插入图片描述

5.服务的安装

服务程序已经生成,但是打开服务管理器,里面并没有我们的服务,因为还没有安装。

在这里插入图片描述
安装有两种方式:

5.1 命令行安装

在开始菜单的vs2019下,找到任何一个命令行窗口,用管理员权限打开,输入cd /d path跳转到编译完的服务程序所在目录。
在这里插入图片描述
随后输入installutil 服务全名 来安装整个服务,安装完成如下图所示。
在这里插入图片描述
这时,再打开服务管理器,可以看到我们的服务了。
在这里插入图片描述
如要卸载服务,直接在命令行中输入installutil /u 服务全名, 来卸载服务,卸载完成后,如下图。
在这里插入图片描述

5.2 创建安装包来安装服务

当然,现场很多实施人员不懂命令行指令,我们可以通过安装包的方式来安装和卸载服务。在vs2019扩展菜单栏中,找到Installer进行安装,如下图。
在这里插入图片描述
安装完成后,在solution中就可以新建安装包项目setup project,输入名称和路径。
在这里插入图片描述
项目创建好后,在界面的Application Folder中,右键Add,选择项目输出,选择要输出的项目,Service项目为主输出,点确定。
在这里插入图片描述
随后在User’s programs Menu中,右击,创建快捷方式,选择刚刚的项目输出,重命名。
在这里插入图片描述
最后,右击setup project项目,选择View里的自定义操作,在界面中右击添加自定义操作,选择主输出,选择编译这个项目。
在这里插入图片描述
此时,安装包就创建完成了,可以利用安装包来创建和删除服务。
在这里插入图片描述
在这里插入图片描述

OK,到此时,一个完整的Windows 服务就创建和部署完了,总体没啥难度,思路也都和大家分享了,感觉写得也很详细了。

欢迎大家交流,不喜勿碰~~ε≡٩(๑>₃<)۶ 一心向学
转载请注明出处,谢谢~

猜你喜欢

转载自blog.csdn.net/weixin_44239774/article/details/125945160