使用C#创建安装Windows服务程序(干货)

这篇具有很好参考价值的文章主要介绍了使用C#创建安装Windows服务程序(干货)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

开发语言:C#
开发环境: Visual Studio 2022
微软官方文档:https://learn.microsoft.com/zh-cn/dotnet/framework/windows-services/


最近在公司要求使用Windows服务作为消息队列的消费者,所以自行研究了一下C#中Windows服务如何创建以及如何使用,以及部署的方式。我是西瓜程序猿,此篇记录一下供大家参考学习。


一、Windows服务概述

1.1-Windows服务是什么?

Windows服务是在Windows操作系统上,以后台形式运行的应用程序。它们可以在系统启动时自动启动,并且独立于用户登录。Windows服务通常用于执行那些长时间运行、无需用户交互或需要在后台持续执行的任务。


1.2-Windows能用来做什么?

  1. 后台任务和自动化:可以使用Windows服务来执行重复性的计划任务、数据同步、定期备份、报告生成等。
  2. 网络服务:Windows服务可以作为网络服务器提供网络服务,如Web服务器、FTP服务器、邮件服务器等。
  3. 定时任务:Windows服务可以创建定时任务并在指定时间间隔或特定事件发生时触发执行操作。
  4. 数据处理:可以使用Windows服务进行数据处理、数据转换、数据清洗等批量处理任务。
  5. 消息队列:可以用于消息队列的消费者,后台任务一直和消息队列保持长连接,需要消费时会自动接收到进行业务处理。

1.3-Windows服务有什么优势?

  1. 后台执行:Windows服务在后台运行,不会干扰用户的工作,也无需用户登录即可持续执行任务。
  2. 系统级别权限:Windows服务可以在系统级别运行,具有更高的权限,可以访问系统资源和执行敏感操作。
  3. 自动启动:Windows服务可以在系统启动时自动启动,确保任务始终处于运行状态。
  4. 可靠性和稳定性:Windows服务被设计为长时间运行的应用程序,具有较高的可靠性和稳定性。

二、创建Windows服务

2.1-创建Windows服务项目

(1)打开【Visual Studio】开发工具,然后选择【 Windows 服务(.NET Framework) 】,点击下一步。
注意:Windows服务只有在.NET Framework版本中才有了,在跨平台中使用Worker Service。
使用C#创建安装Windows服务程序(干货)
(2)修改项目名称和项目存储目录,项目名称我写的是【MyDemoService】,然后框架我选择的是【.NET Farmework 4.8】,这个可以根据自己的需要填写和选择,然后点击【创建】。
使用C#创建安装Windows服务程序(干货)
创建好的目录如下:【Program.cs】是主程序的入口,【Service1.cs】是服务的入口,可以创建多个,然后在Prodrams.cs中配置就好了。
使用C#创建安装Windows服务程序(干货)
(3)【Service1】服务名称可以重命名修改,此处我重命名为【MyDemoService】, Program.cs文件中也相对应的也要进行修改。
使用C#创建安装Windows服务程序(干货)
使用C#创建安装Windows服务程序(干货)
(4)然后我们就可以在【MyDemoService】中写业务逻辑代码了,有很多种方式可以定位到要写的具体文件,先列举两种常用的。
方法一:在【program.cs】文件中,找到这个类,按键盘上的F12可以直接进入查看文件。
使用C#创建安装Windows服务程序(干货)
方法二:直接右击,然后点击【查看代码】。
使用C#创建安装Windows服务程序(干货)
业务代码写到这里面:
使用C#创建安装Windows服务程序(干货)
到这一步服务就创建好了,然后就写具体的业务代码就行了。注意:服务必须至少重写 OnStart 和 OnStop 才有用。


2.2-服务可以重写的方法

        /// <summary>
        /// 服务启动:指示服务开始运行时应采取的操作。 必须在此过程中为服务编写代码才能执行有用的操作。
        /// </summary>
        /// <param name="args"></param>
        protected override void OnStart(string[] args)
        {
        }

        /// <summary>
        /// 服务停止:指示在服务停止运行时应发生什么情况。
        /// </summary>
        protected override void OnStop()
        {
        }

        /// <summary>
        /// 暂停:指示在服务暂停时应发生什么情况。
        /// </summary>
        protected override void OnPause()
        {
        }

        /// <summary>
        /// 继续:指示服务在暂停后恢复正常运行时应发生什么情况。
        /// </summary>
        protected override void OnContinue()
        {
        }

        /// <summary>
        /// 停止前:指示在系统关闭之前应发生什么情况(如果此时服务正在运行)。
        /// </summary>
        protected override void OnShutdown()
        {
        }

2.3-配置日志(log4net)

为了方便测试,先介绍一下如何使用log4net做日志记录,当日志启动时和停止时我们记录一下。

(1)我们在项目目录下新建一个文件夹【LogConfig】,然后再创建一个文件为【log4net.config】。
使用C#创建安装Windows服务程序(干货)
(2)【log4net.config】内容如下。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
	<configSections>
		<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
	</configSections>

	<system.web>
		<compilation debug="true" targetFramework="4.5.2" />
		<httpRuntime targetFramework="4.5.2" />
	</system.web>
	<log4net>
		<!--错误日志:::记录错误日志-->
		<!--按日期分割日志文件 一天一个-->
		<!-- appender 定义日志输出方式   将日志以回滚文件的形式写到文件中。-->
		<appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender">
			<!--保存路径:下面路径项目启动的时候自动在C盘中创建log、logError文件-->
			<file value="log/error/error_" />
			<!-- 如果想在本项目中添加路径,那就直接去掉C:\\  只设置log\\LogError   项目启动中默认创建文件 -->
			<appendToFile value="true"/>
			<!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])-->
			<rollingStyle value="Date"/>
			<!--这是按日期产生文件夹-->
			<datePattern value="yyyy-MM-dd'.log'"/>
			<!--是否只写到一个文件中-->
			<staticLogFileName value="false"/>
			<!--保留的log文件数量 超过此数量后 自动删除之前的   好像只有在 按Size分割时有效 设定值value="-1"为不限文件数-->
			<param name="MaxSizeRollBackups" value="100"/>
			<!--每个文件的大小。只在混合方式与文件大小方式下使用。超出大小后在所有文件名后自动增加正整数重新命名,数字最大的最早写入。可用的单位:KB|MB|GB。不要使用小数,否则会一直写入当前日志-->
			<maximumFileSize value="50MB" />
			<!-- layout 控制Appender的输出格式,也可以是xml  一个Appender只能是一个layout-->
			<layout type="log4net.Layout.PatternLayout">
				<!--每条日志末尾的文字说明-->
				<!--输出格式 模板-->
				<!-- <param name="ConversionPattern"  value="记录时间:%date 线程ID:[%thread] 日志级别:%-5level 记录类:%logger   
        操作者ID:%property{Operator} 操作类型:%property{Action}%n  当前机器名:%property%n当前机器名及登录用户:%username %n  
        记录位置:%location%n 消息描述:%property{Message}%n   异常:%exception%n 消息:%message%newline%n%n" />-->

				<!--样例:2008-03-26 13:42:32,111 [10] INFO  Log4NetDemo.MainClass [(null)] - info-->
				<!--<conversionPattern value="%newline %n记录时间:%date %n线程ID:[%thread] %n日志级别: %-5level %n错误描述:%message%newline %n"/>-->
				<conversionPattern value="%n==========
                                  %n【日志级别】%-5level
                                  %n【记录时间】%date
                                  %n【执行时间】[%r]毫秒
                                  %n【出错文件】%F
                                  %n【出错行号】%L
                                  %n【出错的类】%logger 属性[%property{NDC}]
                                  %n【错误描述】%message
                                  %n【错误详情】%newline"/>
			</layout>
			<filter type="log4net.Filter.LevelRangeFilter,log4net">
				<levelMin value="ERROR" />
				<levelMax value="FATAL" />
			</filter>
		</appender>

		<!--DEBUG:::记录DEBUG日志-->
		<!--按日期分割日志文件 一天一个-->
		<!-- appender 定义日志输出方式   将日志以回滚文件的形式写到文件中。-->
		<appender name="DebugAppender" type="log4net.Appender.RollingFileAppender">
			<!--保存路径:下面路径项目启动的时候自动在C盘中创建log、logError文件-->
			<file value="log/debug/debug_" />
			<!-- 如果想在本项目中添加路径,那就直接去掉C:\\  只设置log\\LogError   项目启动中默认创建文件 -->
			<appendToFile value="true"/>
			<!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])-->
			<rollingStyle value="Date"/>
			<!--这是按日期产生文件夹-->
			<datePattern value="yyyy-MM-dd'.log'"/>
			<!--是否只写到一个文件中-->
			<staticLogFileName value="false"/>
			<!--保留的log文件数量 超过此数量后 自动删除之前的   好像只有在 按Size分割时有效 设定值value="-1"为不限文件数-->
			<param name="MaxSizeRollBackups" value="100"/>
			<!--每个文件的大小。只在混合方式与文件大小方式下使用。超出大小后在所有文件名后自动增加正整数重新命名,数字最大的最早写入。可用的单位:KB|MB|GB。不要使用小数,否则会一直写入当前日志-->
			<maximumFileSize value="50MB" />
			<!-- layout 控制Appender的输出格式,也可以是xml  一个Appender只能是一个layout-->
			<layout type="log4net.Layout.PatternLayout">
				<!--每条日志末尾的文字说明-->
				<!--输出格式 模板-->
				<!-- <param name="ConversionPattern"  value="记录时间:%date 线程ID:[%thread] 日志级别:%-5level 记录类:%logger   
        操作者ID:%property{Operator} 操作类型:%property{Action}%n  当前机器名:%property%n当前机器名及登录用户:%username %n  
        记录位置:%location%n 消息描述:%property{Message}%n   异常:%exception%n 消息:%message%newline%n%n" />-->

				<!--样例:2008-03-26 13:42:32,111 [10] INFO  Log4NetDemo.MainClass [(null)] - info-->
				<!--<conversionPattern value="%newline %n记录时间:%date %n线程ID:[%thread] %n日志级别: %-5level %n错误描述:%message%newline %n"/>-->
				<conversionPattern value="%n==========
                                  %n【日志级别】%-2level
                                  %n【记录时间】%date
                                  %n【执行时间】[%r]毫秒
                                  %n【debug文件】%F
                                  %n【debug行号】%L
                                  %n【debug类】%logger 属性[%property{NDC}]
                                  %n【debug描述】%message"/>
			</layout>
			<filter type="log4net.Filter.LevelRangeFilter,log4net">
				<levelMin value="DEBUG" />
				<levelMax value="WARN" />
			</filter>
		</appender>


		<!--INFO:::记录INFO日志-->
		<!--按日期分割日志文件 一天一个-->
		<!-- appender 定义日志输出方式   将日志以回滚文件的形式写到文件中。-->
		<appender name="INFOAppender" type="log4net.Appender.RollingFileAppender">
			<!--保存路径:下面路径项目启动的时候自动在C盘中创建log、logError文件-->
			<file value="log/info/info_" />
			<!-- 如果想在本项目中添加路径,那就直接去掉C:\\  只设置log\\LogError   项目启动中默认创建文件 -->
			<appendToFile value="true"/>
			<!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])-->
			<rollingStyle value="Date"/>
			<!--这是按日期产生文件夹-->
			<datePattern value="yyyy-MM-dd'.log'"/>
			<!--是否只写到一个文件中-->
			<staticLogFileName value="false"/>
			<!--保留的log文件数量 超过此数量后 自动删除之前的   好像只有在 按Size分割时有效 设定值value="-1"为不限文件数-->
			<param name="MaxSizeRollBackups" value="100"/>
			<!--每个文件的大小。只在混合方式与文件大小方式下使用。超出大小后在所有文件名后自动增加正整数重新命名,数字最大的最早写入。可用的单位:KB|MB|GB。不要使用小数,否则会一直写入当前日志-->
			<maximumFileSize value="50MB" />
			<!-- layout 控制Appender的输出格式,也可以是xml  一个Appender只能是一个layout-->
			<layout type="log4net.Layout.PatternLayout">
				<!--每条日志末尾的文字说明-->
				<!--输出格式 模板-->
				<!-- <param name="ConversionPattern"  value="记录时间:%date 线程ID:[%thread] 日志级别:%-5level 记录类:%logger   
        操作者ID:%property{Operator} 操作类型:%property{Action}%n  当前机器名:%property%n当前机器名及登录用户:%username %n  
        记录位置:%location%n 消息描述:%property{Message}%n   异常:%exception%n 消息:%message%newline%n%n" />-->

				<!--样例:2008-03-26 13:42:32,111 [10] INFO  Log4NetDemo.MainClass [(null)] - info-->
				<!--<conversionPattern value="%newline %n记录时间:%date %n线程ID:[%thread] %n日志级别: %-5level %n错误描述:%message%newline %n"/>-->
				<conversionPattern value="%n==========
                                  %n【日志级别】%-2level
                                  %n【记录时间】%date
                                  %n【执行时间】[%r]毫秒
                                  %n【info文件】%F
                                  %n【info行号】%L
                                  %n【info类】%logger 属性[%property{NDC}]
                                  %n【info描述】%message"/>
			</layout>
			<filter type="log4net.Filter.LevelRangeFilter,log4net">
				<levelMin value="INFO" />
				<levelMax value="WARN" />
			</filter>
		</appender>

		<!--Set root logger level to DEBUG and its only appender to A1-->
		<root>
			<!--控制级别,由低到高: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF-->
			<level value="ALL" />
			<appender-ref ref="DebugAppender" />
			<appender-ref ref="ErrorAppender" />
			<appender-ref ref="INFOAppender" />
		</root>
	</log4net>
</configuration>

(3)并且右击【【log4net.config】】文件,点击【属性】,然后将[复制到输出目录]设置为【始终复制】。
使用C#创建安装Windows服务程序(干货)
(4)然后安装log4net。在项目目录中右击【引用】,然后点击【管理NuGet程序包】
使用C#创建安装Windows服务程序(干货)
(5)然后点击浏览,搜索【log4net】,右侧点击安装。
使用C#创建安装Windows服务程序(干货)
(6)重要:然后配置【AssemblyInfo.cs 】文件,如果不配置,是输出不了日志的。
使用C#创建安装Windows服务程序(干货)
添加到底部即可:(如果你的【log4net.config】文件路径和我的不一样,记得修改成跟自己配置路径一样的)。
使用C#创建安装Windows服务程序(干货)
代码:

[assembly: log4net.Config.XmlConfigurator(ConfigFileExtension = "config", ConfigFile = "LogConfig/log4net.config", Watch = true)]

(7)在服务启动方法【OnStart】中,配置启动log4net。
使用C#创建安装Windows服务程序(干货)
代码:

XmlConfigurator.Configure(new System.IO.FileInfo("LogConfig/log4net.config"));

(8)然后就可以使用log4net了,首先在Windows服务中获得log4net的实例。
使用C#创建安装Windows服务程序(干货)
代码:

 private static readonly log4net.ILog logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

三、Windows服务的运行和部署

3.1-服务基本配置

(1)点击我们的服务【MyDemoService.cs】,然后右击点击【添加安装程序】。
使用C#创建安装Windows服务程序(干货)
(2)然后可以看到下面多出来了一个文件,就是安装程序。
使用C#创建安装Windows服务程序(干货)
使用C#创建安装Windows服务程序(干货)
(3)然后可以修改基本信息,服务组件中的【服务名称】【服务描述】等等。我们右击【serviceInstall1】点击属性,然后进行修改。
使用C#创建安装Windows服务程序(干货)
使用C#创建安装Windows服务程序(干货)
(4)然后点击【serviceProcessInstall1】右击属性,进行修改。
使用C#创建安装Windows服务程序(干货)
使用C#创建安装Windows服务程序(干货)


3.2-服务运行与发布

当我们直接按F5或者其他方式直接运行项目时,会提示:"无法从命令行或调试程序启动服务。必须首先安装 Windows服务(使用installutil.exe),然后用ServerExplorer、Windows服务管理工具或 NET START命令启动它。"。不是这样运行的,跟着下面步骤来操作运行与发布Windows服务吧。

使用C#创建安装Windows服务程序(干货)

前提注意:如果你设置的目标平台是x64,打开的目录会不一样,不然导致服务运行不起来。可以右击项目名,点击【属性】——>【生成】——>【目标平台】查看。
使用C#创建安装Windows服务程序(干货)
如果不是x64版本,复制这个地址:

C:\Windows\Microsoft.NET\Framework\v4.0.30319

如果是x64版本,复制这个地址:

C:\Windows\Microsoft.NET\Framework64\v4.0.30319

不然会报类似这种错误:在初始化安装时发生异常: System.BadImageFormatException: 未能加载文件或程序集...

(1)然后我们把上面的地址(根据自己的环境选择)添加到环境变量中。点击【控制面板】——>【系统和安全】
使用C#创建安装Windows服务程序(干货)
(2)然后点击【系统】
使用C#创建安装Windows服务程序(干货)
(3)点击【高级系统设置】
使用C#创建安装Windows服务程序(干货)
(4)点击【环境变量】
使用C#创建安装Windows服务程序(干货)
(5)在【系统变量】中找到Path,然后点击【编辑】。
使用C#创建安装Windows服务程序(干货)
(6)然后点击【新建】,然后把我们拷贝的目录复制到这里。然后点击确认即可。
使用C#创建安装Windows服务程序(干货)
(7)测试是否配置成功,输入这个命令查看一下【InstallUtil】,如果是下面这样的内容说明成功了。
使用C#创建安装Windows服务程序(干货)
(8)然后编辑解决方案和项目。
使用C#创建安装Windows服务程序(干货)
(9)以管理员身份运行cmd命令,然后安装服务。

InstallUtil 项目启动执行文件全路径
西瓜程序猿的例子:
InstallUtil D:\项目演示临时保存\MyDemoService\MyDemoService\bin\Debug\MyDemoService.exe

使用C#创建安装Windows服务程序(干货)
(10)出现这个说明安装成功了。
使用C#创建安装Windows服务程序(干货)
(11)打开服务管理器,找到要启动的服务,然后右击启动服务。
使用C#创建安装Windows服务程序(干货)
启动后可以看到日志也有了:
使用C#创建安装Windows服务程序(干货)
(12)如果要卸载服务,可以运行这个命令:

InstallUtil /u 项目启动执行文件全路径
西瓜程序猿的例子:
InstallUtil /u D:\项目演示临时保存\MyDemoService\MyDemoService\bin\Debug\MyDemoService.exe

使用C#创建安装Windows服务程序(干货)


3.3-常见命令

1、安装服务:InstallUtil 项目启动执行文件全路径
3、启动服务:net start 服务名
4、停止服务:net stop 服务名
4、卸载服务:InstallUtil /u 项目启动执行文件全路径


3.4-查看计算机事件

如果在启动Windows服务时报错,我们可以通过查看计算机事件查询到具体的报错信息。

(1)按键盘上的【Win+R】,然后输入【eventvwr.msc】
使用C#创建安装Windows服务程序(干货)
(2) 然后点击确定,就可以打开事件查看器的窗口。在窗口左侧找到【Windows日志】——>【系统】,就可以看到电脑的开机关机及日志记录了。
使用C#创建安装Windows服务程序(干货)


3.5-在服务器上安装相同Windows服务的多个实例

这个方案比较全可以参考:https://www.u72.net/b/show-317328.html

我是西瓜程序猿,用的是这种方法:
(1)通过此命令可以部署多个,[servicename]唯一就行了,自己配置。

sc create [servicename] binpath= [path to your exe]

注意: [servicename]填写的是服务名称,[path to your exe] 是执行文件的路径,必须是完整路径,不要忘记binpath= 后面的空格。这种方法确实允许多次安装服务。但是服务安装程序提供的所有信息。 F.e.描述、登录类型等被忽略。


3.6-常见的错误

1、无法打开计算机“.”上的服务控制管理器

在“安装”阶段发生异常。
System.InvalidOperationException: 无法打开计算机“.”上的服务控制管理器。此操作可能需要其他特权。
引发了内部异常 System.ComponentModel.Win32Exception,错误消息如下: 拒绝访问。。
正在开始安装的“回退”阶段。
查看日志文件的内容以获得 D:\项目演示临时保存\MyDemoService\MyDemoService\bin\Debug\MyDemoService.exe 程序集的进度。
该文件位于 D:\项目演示临时保存\MyDemoService\MyDemoService\bin\Debug\MyDemoService.InstallLog。
正在回滚程序集“D:\项目演示临时保存\MyDemoService\MyDemoService\bin\Debug\MyDemoService.exe”。
受影响的参数是:
logtoconsole =
logfile = D:\项目演示临时保存\MyDemoService\MyDemoService\bin\Debug\MyDemoService.InstallLog
assemblypath = D:\项目演示临时保存\MyDemoService\MyDemoService\bin\Debug\MyDemoService.exe
正在将事件日志还原到源 TestDemoServices 的前一状态。
“回退”阶段已成功完成。
已完成事务处理安装。
安装失败,已执行回退。

解决:权限不够,打开cmd时记得【以管理员身份】打开。


2、未能加载文件或程序集xxx的基个依赖项

在初始化安装时发生异常: System.BadImageFormatException: 未能加载文件或程序集“file://E:\DebuginServers.sB惑的基个依赖项。试图加载格式不正确的程序。

解决:请看本文第【3.2】点


3、在执行【.bat】文件时,报路径不存在相关的错

** 执行命令**:InstallUtil /u D:\项目演示临时保存\MyDemoService\MyDemoService\bin\Debug\MyDemoService.exe
错误信息:C:\Windows\system32>InstallUtil /u D:\椤圭洰婕旂ず涓存椂淇濆瓨\MyDemoService\MyDemoService\bin\Debug\MyDemoService.exe Microsoft (R) .NET Framework 安装实用工具版本 4.8.9037.0 版权所有 (C) Microsoft Corporation。保留所有权利。 在初始化安装时发生异常: System.IO.FileNotFoundException: 未能加载文件或程序集“file:///D:\椤圭洰婕旂ず涓存椂淇濆瓨\MyDemoService\MyDemoService\bin\Debug\MyDemoService.exe”或它的某一个依赖项。系统找不到指定的文件。。

分析:这个错是乱码导致的,执行的命令是这个【InstallUtil /u D:\项目演示临时保存\MyDemoService\MyDemoService\bin\Debug\MyDemoService.exe】,但是在控制台里面显示的是这个【file:///D:\椤圭洰婕旂ず涓存椂淇濆瓨\MyDemoService\MyDemoService\bin\Debug\MyDemoService.exe】。 出现了乱码,这可能是由于控制台编码设置不正确导致的 。
解决:使用正确的编码,尝试将控制台编码设置为与文件路径所使用的编码一致。例如,如果文件路径是UTF-8编码,您可以在控制台中执行以下命令进行设置:

chcp 65001

截图:
使用C#创建安装Windows服务程序(干货)



四、高效工具:编写bat启动卸载服务

4.1-安装服务

我们可以创建一个文件【安装服务.bat】输入以下内容:

chcp 65001
REM Install
InstallUtil 项目启动执行文件全路径
pause

注意:执行这个命令需要【以管理员身份】运行,不然会报这个错误:

System.InvalidOperationException: 无法打开计算机“.”上的服务控制管理器。此操作可能需要其他特权。
引发了内部异常 System.ComponentModel.Win32Exception,错误消息如下: 拒绝访问。。

正确执行方式:
使用C#创建安装Windows服务程序(干货)


4.2-启动服务

我们可以创建一个文件【卸载服务.bat】输入以下内容:

REM Install
net start 服务名
pause

注意:执行这个命令需要【以管理员身份】运行,不然会报这个错误:

发生系统错误。
拒绝访问。


4.3-停止服务

我们可以创建一个文件【卸载服务.bat】输入以下内容:

REM Install
net stop 服务名
pause

注意:执行这个命令需要【以管理员身份】运行,不然会报这个错误:

发生系统错误。
拒绝访问。


4.4-卸载服务

我们可以创建一个文件【卸载服务.bat】输入以下内容:

chcp 65001
REM Install
InstallUtil /u  项目启动执行文件全路径
pause


原文链接:https://www.cnblogs.com/kimiliucn/p/17637533.html文章来源地址https://www.toymoban.com/news/detail-653116.html

到了这里,关于使用C#创建安装Windows服务程序(干货)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • WPF项目创建HTTP WEB服务,不使用IIS业务 WPF桌面程序WebApi WPF 集成WebApi C# 创建HTTP Web API服务

    在C# WPF应用程序中直接创建HTTP服务或WebAPI服务有以下优点: 自托管服务: 简化部署:无需依赖外部服务器或IIS(Internet Information Services),可以直接在应用程序内部启动和运行Web服务。 集成紧密:与WPF应用程序的其他组件和逻辑可以更紧密地集成,因为它们都在同一个进程

    2024年02月02日
    浏览(59)
  • VC++创建windows服务程序

    目录 1.关于windows标准可执行程序和服务程序 2.服务相关整理 2.1 VC++编写服务 2.2 服务注册 2.3  服务卸载 2.4 启动服务 2.5 关闭服务 2.6 sc命令 2.7 查看服务 3.标准程序 3.1 后台方式运行标准程序 3.2 查找进程 3.3 终止进程        以前经常在Linux下编写服务器程序,服务器程序大多

    2024年02月07日
    浏览(31)
  • 【C#】Windows服务(Service)安装及启停

    目录 一、创作背景 二、问题解决 2.1 安装Windows service服务 2.2 主方法Main()主方法改写 2.3 安装service服务/卸载service服务 2.4 服务启停 2.5 服务调用运行 2.6 关于权限的提升 三、资源分享 3.1 引入组件 3.2 新手使用 我能抽象出整个世界,但是我不能抽象你。 想让你成为私有常量,

    2023年04月08日
    浏览(39)
  • 程序员必备技能:一键创建windows 服务

    使用windows开发或者使用windows服务器的朋,应该经常会遇到有些程序要开机启动,或者有些服务要持续执行。 这样最稳定可靠的,就是把程序创建为windows服务。 以下bat脚本,仅供参考。 把以上代码复制到记事本,保存为.bat文件。然后管理员身份运行即可创建服务。 运行完

    2024年02月19日
    浏览(49)
  • Windows10安装VS Code报错:安装程序不能创建目录

    在Windows10下安装VS Code编辑器时,将安装位置手动设置为D盘内,运行安装程序时报错: 提示安装程序不能创建目录。 使用管理员权限运行安装程序。方法一:右键——以管理员身份运行; 方法二:右键——属性——兼容性——以管理员身份运行此程序。 再次运行安装程序,

    2024年02月11日
    浏览(46)
  • 微信小程序详细教程,两小时零基础注册和使用小程序,并利用Ai引擎真正0代码开发小程序!!!(干货,建议收藏)

    一台电脑 下载并安装微信开发者工具 一个微信扫码登录         随着科技的飞速发展和互联网的普及,微信作为一款社交媒体平台,已经渗透到我们日常生活的方方面面。无论是老年人还是年轻人,无论是城市还是农村,微信的用户群体已经覆盖了各个年龄段和各个社会阶

    2024年02月03日
    浏览(57)
  • C# Solidworks二次开发:自动创建虚拟零件及使用注意事项

    今天要讲的是关于在solidworks中如何自动创建虚拟零件的功能,也就是solidworks中插入新零件这个功能。 实现这个功能需要使用的API如下所示: InsertNewVirtualPart(swFaceOrPlane1, out swcomp2); 其中这个方法中使用到了两个参数。 第一个参数:为一个平面,或是一个基准平面。 第二

    2024年02月15日
    浏览(60)
  • 华三服务器R4900 G3通过管理口创建RAID1,安装Windows服务器系统(Windows server 2016)

    通过一根网线接到H3C服务器的HDM管理口,配置IP地址为192.168.1.1:24(服务器的管理地址为192.168.1.2) 材料: 服务器:Uniserver R4900 G3 Windows server 2016(系统镜像) 一条网线 一台电脑(笔记本)可以插网线的               Disabled:关闭;Enabled:开启;   check all:将所有硬盘修

    2024年02月07日
    浏览(45)
  • C#使用NModbus4库创建Modbus TCP Slave(服务器)简单示例

    本文续上篇Codesys—标准库ModbusTCP Master(客户端)配合C#的NModbus4库的通讯示例 链接:https://blog.csdn.net/wushangwei2019/article/details/136375234?spm=1001.2014.3001.5501 上篇描述在Codesys端的Modbus TCP Master(客户端)的设备添加、IO映射、通讯简单展示等方面,本文记录PC端C#利用NModbus4通讯库创建Mo

    2024年03月16日
    浏览(42)
  • Linux系列:开发环境搭建:ubuntu图形界面安装samba服务器、SSH使用、mount -t cifs 挂载windows共享目录方法与问题解决

    samba一种在局域网上共享文件和打印机的一种通信协议,它为局域网内的不同计算机之间提供文件及打印机等资源的共享服务。 通常linux开发环境要和windows平台进行文件交互,使用samba进行文件夹共享,这样会给开发带来很大的便利性,samba安装很简单,下面介绍一下在ubunt

    2024年02月21日
    浏览(68)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包