VS2022创建Windows服务程序

创建一个Windows服务程序

可以创建Windows服务程序

打开VS2022,新建项目。
在这里插入图片描述
在这里插入图片描述
创建成功后的目录结构如左侧所示,至此项目构建完成。
在这里插入图片描述

配置相关信息

添加安装程序
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
重新生成一下解决方案
在这里插入图片描述
至此配置完成。

脚本可执行文件

在工程目录的bin\Debug目录下 新建两个脚本文件–install.bat和uninstall.bat,分别用于安装服务卸载服务
在这里插入图片描述
install.bat

%SystemRoot%\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe %~dp0MyFirstWindowsService.exe
Net Start MyFirstService
sc config MyFirstService start=auto
pause

简单说明
在这里插入图片描述
uninstall.bat

%SystemRoot%\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /u %~dp0MyFirstWindowsService.exe
pause

至此配置完成。

执行脚本文件

执行安装脚本文件
在这里插入图片描述

可以右键我的电脑 -> 管理 找到服务,在右侧寻找我们自己的服务名称
在这里插入图片描述

在这里插入图片描述

执行卸载脚本文件
在这里插入图片描述

如果不能创建Windows服务程序

如果输入上述条件没有找到可创建的工程,点击安装多个工具和功能
在这里插入图片描述
或者在某个工程的工具里点击获取工具和功能

在这里插入图片描述
在这里插入图片描述
等待安装完毕,按上面的步骤来即可。

简单地使用

使用本机服务和定时器Timer,简单做一个WindowsService的记录日志。

创建一个新的Windows服务

按照上述步骤创建一个新的Windows服务,名为WindowsService2,并且服务名称为WindowsService2

我们主要的代码在Service1.cs中写,选中该文件,右键选择查看代码。
在这里插入图片描述
记得在App.config中设置键值对 value是日志记录地址 可自行选择。
在这里插入图片描述

主要代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;
using System.Timers;
using System.IO;
using System.Configuration;

namespace WindowsService2
{
    public partial class Service1 : ServiceBase
    {
        public Service1()
        {
            InitializeComponent();
        }
        //创建定时器
        public System.Timers.Timer ServiceTimer;
        //从App.config中取值 这里我的日志文件位置在F:\log.txt 这里可以自行设置
        public string filePath = ConfigurationManager.AppSettings["FilePath"];
        //主要功能代码在这里写
        protected override void OnStart(string[] args)
        {
            //日志记录方法
            WriteLog(filePath, "启动服务。");
            InitTimer();//初始化的定时器
        }

        protected override void OnStop()
        {
            //停止服务
            WriteLog(filePath , "停止服务。");
        }

        public void InitTimer()
        {
            //设置定时器两秒执行一次
            ServiceTimer = new System.Timers.Timer(2000);
            //执行的操作为Excute
            ServiceTimer.Elapsed += Excute; 
            //是否重复执行
            ServiceTimer.AutoReset = true;
            //是否执行Elapsed中的事件
            ServiceTimer.Enabled = true;
        }

        public void Excute(Object o , System.Timers.ElapsedEventArgs e)
        {
            //判断是否执行
            if (!File.Exists(filePath))
            {
                //不存再则创建
                File.Create(filePath);
            }
            //再这里写入日志
            string date = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");         
            WriteLog(filePath, DateTime.Now.ToString(), "进行了操作。 日志文件路径位于: " + filePath + " AppSetting : " + ConfigurationManager.AppSettings["FilePath"]);
        }
        //写入日志文件
        public static void WriteLog(string path, params string[] s)
        {
            //创建输入流
            System.IO.StreamWriter writer = null;
            try
            {
                writer = new System.IO.StreamWriter(path, true);
                StringBuilder sb = new StringBuilder("");
                for (int i = 0; i < s.Length; i++)
                {
                    sb.Append(" ");
                    sb.Append(s[i]);
                }
                writer.WriteLine(sb.ToString());
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

            finally
            {
                //关闭流 释放资源
                if (writer != null)
                {
                    writer.Close();
                    writer.Dispose();
                }
            }
        }
    }
}

执行结果

在这里插入图片描述

其他的问题

更改代码后需要重新生成

每次更改执行代码后需要右键项目 -> 重新生成,否则更改不会生效。
在这里插入图片描述

某些命名空间如无效需手动引入

以Configuration的命名空间举例,即使加了using System.Configuration; 也有可能出现ConfigurationManager无法使用,这时我们可以手动引入。
找到工程右侧引入,右键添加引用。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

脚本问题

编码问题

创建bat文件时,有时候字符集编码可能不对,导致脚本执行时出现问题,我们可以用Notepad3打开,更改编码格式为ANSI或者UTF-8。
在这里插入图片描述

权限问题

执行脚本文件时,需要右键以管理员身份运行,否则就会出现以下情况,导致服务安装失败。
在这里插入图片描述

空格问题

如果脚本某些地方出现空格,会导致脚本运行失败。
比如
在这里插入图片描述

会导致以下报错
在这里插入图片描述
好了今天就学到这里了,先奖励下自己。

  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值