VS2022创建Windows服务程序的方法步骤

 更新时间:2022年05月19日 11:54:27   作者:三文鱼先生  
本文主要介绍了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。

在这里插入图片描述

权限问题

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

在这里插入图片描述

空格问题

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

会导致以下报错

在这里插入图片描述

到此这篇关于VS2022创建Windows服务程序的方法步骤的文章就介绍到这了,更多相关VS2022创建Windows服务程序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言自增(++)和自减(--)实例详解

    C语言自增(++)和自减(--)实例详解

    本篇文章主要介绍了C语言的自增和自减的基本知识,并附有代码示例,以便大家理解,有需要的朋友可以看下
    2016-07-07
  • C++中typedef 及其与struct的结合使用

    C++中typedef 及其与struct的结合使用

    这篇文章主要介绍了C++中typedef 及其与struct的结合使用,需要的朋友可以参考下
    2014-02-02
  • C语言详细分析讲解关键字enum与sizeof及typedef的用法

    C语言详细分析讲解关键字enum与sizeof及typedef的用法

    在 C 语言中经常会见到 enum、sizeof、typedef,那么我们今天就来讲解下它们三个,enum是C语言中的一种自定义类型,它是一种枚举类型,sizeof是编译器的内置指示符,用于计算类型或变量所占内存打小,typedef用于给一个已经存在的数据类型重命名,本质上不能产生新的类型
    2022-04-04
  • C++德州扑克的核心规则算法

    C++德州扑克的核心规则算法

    德州扑克想必很多人都玩过,当然对于新手需要说明的是,德州指的是德克萨斯州,而不是山东德州。分享下在计算最大牌型,比牌逻辑的算法和洗牌的方法,希望对大家有帮助。
    2016-04-04
  • Qt数据库应用之超级自定义委托

    Qt数据库应用之超级自定义委托

    Qt中需要用到自定义委托的情形很多,比如提供下拉框选择,进度条展示下载进度啥的,默认的单元格是没有这些效果的,需要自己单独用委托的形式来展示。本文将为大家介绍Qt中如何进行超级自定义委托,需要的可以参考一下
    2022-03-03
  • C++ qt 使用jsoncpp json 读写操作

    C++ qt 使用jsoncpp json 读写操作

    JsonCpp是一个基于C++语言的开源库,用于C++程序的Json数据的读写操作,本文重点给大家介绍C++ qt 使用jsoncpp json 读写操作,感兴趣的朋友跟随小编一起看看吧
    2021-11-11
  • Qt之简单的异步操作实现方法

    Qt之简单的异步操作实现方法

    这篇文章主要介绍了Qt之简单的异步操作实现方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • C++ cmake实现日志类的示例代码

    C++ cmake实现日志类的示例代码

    CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。本文就来利用cmake实现日志类,感兴趣的小伙伴可以了解一下
    2023-03-03
  • C语言实现十六进制与二进制的相互转换

    C语言实现十六进制与二进制的相互转换

    这篇文章主要为大家详细介绍了如何利用c语言实现将文件中十六进制数据与二进制数据相互转换,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的可以学习一下
    2022-11-11
  • opencv3/C++ PHash算法图像检索详解

    opencv3/C++ PHash算法图像检索详解

    今天小编就为大家分享一篇opencv3/C++ PHash算法图像检索详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12

最新评论