惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
爱范儿
爱范儿
H
Help Net Security
V
Visual Studio Blog
J
Java Code Geeks
Stack Overflow Blog
Stack Overflow Blog
Microsoft Security Blog
Microsoft Security Blog
Apple Machine Learning Research
Apple Machine Learning Research
MyScale Blog
MyScale Blog
The Cloudflare Blog
Martin Fowler
Martin Fowler
D
Docker
腾讯CDC
F
Fortinet All Blogs
雷峰网
雷峰网
GbyAI
GbyAI
G
Google Developers Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Recent Announcements
Recent Announcements
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Blog — PlanetScale
Blog — PlanetScale
Engineering at Meta
Engineering at Meta
博客园 - 聂微东
博客园 - 叶小钗

博客园 - WmW

C#学习牛顿迭代法开方 mysql将一个表中指定时间之后的新数据导入到另一个表中 使用具体时间和DateTime.Now运算时需要注意DateTime.Now的毫秒数 简单搭建一个 ASP.NET Core Web API + Mysql + SqlSugar demo项目 C# 学习研究CRC校验 C# 学习逆变和协变 C# 标准的Dispose模式 C# 返回Task或者Task<T>的方法中如果没有异步方法,就没必要使用async修饰 关于字节序的概念加深 C# 基于ReadOnlySequence和ReadOnlySequenceSegment的简单封装 简单接触BCD码,以及使用C#简单实现BCD转换 C# ReadOnlySequence和ReadOnlySequenceSegment简单使用 C# 非常简单的文字转语音实现 C# 输出年龄和属相列表 C# 封装了一个用来对参数值进行范围限制的泛型方法 C# 为WindowsDefender防火墙已经存在的入站规则添加IP地址 C# async void 方法中使用await时外部不会等待 C# Channel学习 C# 使用字符串分割字符串 C# 一个简单的连续心率血氧压缩算法 C# 将日期时间按照ISO 8601标准转成字符串 Dapper传递参数对象时,只支持属性,无法解析字段(出现Parameter '?id' must be defined)
C# 将Framework4.8控制台程序注册为windows服务
WmW · 2025-02-21 · via 博客园 - WmW

这里讲的是.Net Framework4.8的方式,后续的各类Net Core版本则是另一种方式,

1,要先有一个net4.8的控台程序

2,在控制台项目上右键新建项,找到Windows服务,选中,添加

3,将原控制台中Main中的代码全部移动到Service1.cs的OnStart方法中(选中Service1.cs右键查看代码或者F7进入代码页),注意OnStart中的代码不能阻塞,如果有类似阻塞监听之类的操作,需要将其放到异步线程中,还有就是注册为Windows服务后,Environment.CurrentDirectory属性的值会变为“C:\Windows\System32”,如果要定位到应用程序的跟目录,可以使用AppDomain.CurrentDomain.BaseDirectory

4,将原控制台Program的Main修改为

        static void Main(string[] args) {
            ServiceBase.Run(new Service1());
        }

5,在Service1.cs的设计界面右键添加安装程序,项目中会多了ProjectInstaller.cs项

6,在ProjectInstaller.cs设计界面右键serviceProcessInstaller1,进入属性界面,将Account改为LocalSystem

7,在ProjectInstaller.cs设计界面右键serviceInstaller1,进入属性界面,修改其中的ServiceName(服务名称),DisplayName(显示名称),Description(描述)为你想要的信息,比如,将ServiceName对应的值改为TestRegWinService,将DisplayName的值改为“测试注册windows服务”,Description改为“用来测试将应用程序注册为windows服务”

8,去C:\Windows\Microsoft.NET\Framework\v4.0.30319文件夹下,找到InstallUtil.exe,后续需要用到它来注册服务,

9,生成项目后,在项目的根目录下创建一个新文件夹“安装卸载脚本”,然后将InstallUtil.exe拷贝到该文件夹下

10,再在安装卸载脚本文件夹下创建两个cmd文件,install.cmd和uninstall.cmd,假如生成的exe为TestRegWinService.exe,那么2个文件的内容分别为:

install.cmd

cd /d %~dp0
InstallUtil.exe ..\TestRegWinService.exe
pause

uninstall.cmd

cd /d %~dp0
InstallUtil.exe ..\TestRegWinService.exe /u
pause

最后,以管理员运行install.cmd就能安装服务,运行uninstall.cmd,则能卸载服务

cd /d %~dp0的意思是重新定位到当前文件夹,因为以管理员运行会导致默认路径在c盘

InstallUtil.exe 后面跟上相对路径,就能执行注册服务的操作

如果路径后面再加上/u,则执行卸载操作