创建一个Windows服务程序


可以创建Windows服务程序

打开VS2022,新建项目。

vs2022 开发 android vs2022 开发windows_右键

vs2022 开发 android vs2022 开发windows_System_02

创建成功后的目录结构如左侧所示,至此项目构建完成。

vs2022 开发 android vs2022 开发windows_右键_03


配置相关信息

添加安装程序

vs2022 开发 android vs2022 开发windows_Windows_04

vs2022 开发 android vs2022 开发windows_System_05

vs2022 开发 android vs2022 开发windows_vs2022 开发 android_06

重新生成一下解决方案

vs2022 开发 android vs2022 开发windows_右键_07

至此配置完成。


脚本可执行文件

在工程目录的bin\Debug目录下 新建两个脚本文件–install.bat和uninstall.bat,分别用于安装服务和卸载服务。

vs2022 开发 android vs2022 开发windows_System_08

install.bat

1

2

3

4


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

Net Start MyFirstService

sc config MyFirstService start=auto

pause


简单说明

vs2022 开发 android vs2022 开发windows_vs2022 开发 android_09

uninstall.bat

1

2


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

pause


至此配置完成。


执行脚本文件

执行安装脚本文件

vs2022 开发 android vs2022 开发windows_右键_10

可以右键我的电脑 -> 管理 找到服务,在右侧寻找我们自己的服务名称

vs2022 开发 android vs2022 开发windows_Windows_11

vs2022 开发 android vs2022 开发windows_右键_12

执行卸载脚本文件

vs2022 开发 android vs2022 开发windows_vs2022 开发 android_13


如果不能创建Windows服务程序

如果输入上述条件没有找到可创建的工程,点击安装多个工具和功能。

vs2022 开发 android vs2022 开发windows_Windows_14

或者在某个工程的工具里点击获取工具和功能

vs2022 开发 android vs2022 开发windows_vs2022 开发 android_15

vs2022 开发 android vs2022 开发windows_System_16

vs2022 开发 android vs2022 开发windows_vs2022 开发 android_17

等待安装完毕,按上面的步骤来即可。


简单地使用

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


创建一个新的Windows服务

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

我们主要的代码在Service1.cs中写,选中该文件,右键选择查看代码。

vs2022 开发 android vs2022 开发windows_Windows_18

记得在App.config中设置键值对 value是日志记录地址 可自行选择。

vs2022 开发 android vs2022 开发windows_右键_19

主要代码

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


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();

}

}

}

}

}


执行结果

vs2022 开发 android vs2022 开发windows_右键_20


其他的问题


更改代码后需要重新生成

每次更改执行代码后需要右键项目 -> 重新生成,否则更改不会生效。

vs2022 开发 android vs2022 开发windows_vs2022 开发 android_21


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

以Configuration的命名空间举例,即使加了using System.Configuration; 也有可能出现ConfigurationManager无法使用,这时我们可以手动引入。

找到工程右侧引入,右键添加引用。

vs2022 开发 android vs2022 开发windows_右键_22

vs2022 开发 android vs2022 开发windows_System_23

vs2022 开发 android vs2022 开发windows_右键_24


脚本问题

编码问题

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

vs2022 开发 android vs2022 开发windows_vs2022 开发 android_25

权限问题

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

vs2022 开发 android vs2022 开发windows_右键_26

空格问题

如果脚本某些地方出现空格,会导致脚本运行失败。

比如

vs2022 开发 android vs2022 开发windows_vs2022 开发 android_27

会导致以下报错

vs2022 开发 android vs2022 开发windows_vs2022 开发 android_28