C#用Topshelf创建Windows服务的步骤分享
作者:缥缈的尘埃 发布时间:2022-10-19 00:47:58
标签:c#,topshelf,windows
一、项目创建
创建一个控制台应用程序,项目右键->管理 NuGet 程序包->Topshelft及Topshelf.Log4Net。
二、Topshelf配置
一般来说,服务都会设置每隔多长时间执行一次任务,这里使用System.Threading.Timer来做个简单的日志记录,将日志写入到Debug\Log文件夹下。
2.1、Log4Net配置
新建一个log4net.config的配置文件,在其属性的复制到输出目录项下选择始终复制。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net>
<!-- Console部分log输出格式的设定 -->
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message %newline" />
</layout>
</appender>
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="Log\"/>
<appendToFile value="true"/>
<maxSizeRollBackups value="10"/>
<maximumFileSize value="1MB"/>
<rollingStyle value="Date"/>
<datePattern value='yyyy-MM-dd".log"' />
<staticLogFileName value="false"/>
<!--最小锁定模型以允许多个进程可以写入同一个文件-->
<param name="lockingModel" type="log4net.Appender.FileAppender+MinimalLock" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date %-5level %logger - %message %newline"/>
</layout>
</appender>
<root>
<level value="ALL" />
<appender-ref ref="ConsoleAppender" />
<appender-ref ref="RollingLogFileAppender" />
</root>
</log4net>
</configuration>
2.2、TopshelfService
新建一个TopshelfService类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Topshelf;
using Topshelf.Logging;
namespace LinkTo.Test.TopshelfService
{
public class TopshelfService : ServiceControl
{
private static readonly LogWriter logger = HostLogger.Get<TopshelfService>();
private static Timer timerAsync = null;
private readonly int dueTimeInterval = 1000 * 5; //单位:毫秒
private readonly int periodInterval = 1000 * 5; //单位:毫秒
/// <summary>
/// 构造函数
/// </summary>
public TopshelfService()
{
timerAsync = new Timer(AutoAsyncCallback, null, Timeout.Infinite, Timeout.Infinite);
}
/// <summary>
/// 启动服务
/// </summary>
/// <param name="hostControl"></param>
/// <returns></returns>
public bool Start(HostControl hostControl)
{
try
{
logger.Info("HelloTopshelf Start");
timerAsync.Change(dueTimeInterval, periodInterval);
}
catch (Exception ex)
{
logger.Info(ex.Message);
}
return true;
}
/// <summary>
/// 停止服务
/// </summary>
/// <param name="hostControl"></param>
/// <returns></returns>
public bool Stop(HostControl hostControl)
{
try
{
logger.Info("HelloTopshelf Stop");
if (timerAsync != null)
{
timerAsync.Change(Timeout.Infinite, Timeout.Infinite);
timerAsync.Dispose();
timerAsync = null;
}
}
catch (Exception ex)
{
logger.Info(ex.Message);
}
return true;
}
/// <summary>
/// 回调函数
/// </summary>
/// <param name="state"></param>
private void AutoAsyncCallback(object state)
{
try
{
timerAsync.Change(Timeout.Infinite, Timeout.Infinite);
logger.Info("AutoAsyncCallback执行开始");
Thread.Sleep(1000 * 10);
}
catch (Exception ex)
{
logger.ErrorFormat("AutoAsyncCallback执行异常:{0}", ex.Message);
}
finally
{
timerAsync.Change(dueTimeInterval, periodInterval);
logger.Info("AutoAsyncCallback执行结束");
logger.Info(Environment.NewLine);
}
}
}
}
2.3、配置和运行宿主服务
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Topshelf;
namespace LinkTo.Test.TopshelfService
{
class Program
{
static void Main(string[] args)
{
HostFactory.Run(x =>
{
x.UseLog4Net("log4net.config");
x.RunAsLocalSystem();
x.Service(settings => new TopshelfService());
//服务的描述
x.SetDescription("你好,Topshelf!");
//服务的显示名称
x.SetDisplayName("Hello Topshelf Service");
//服务名称
x.SetServiceName("HelloTopshelf");
});
}
}
}
三、安装与卸载
3.1、安装服务
在Debug文件夹下面,创建一个"安装服务.bat"的批处理文件:
@echo on
rem 设置DOS窗口的背景颜色及字体颜色
color 2f
rem 设置DOS窗口大小
mode con: cols=80 lines=25
@echo off
echo 请按任意键开始安装LinkTo.Test.TopshelfService服务
rem 输出空行
echo.
pause
LinkTo.Test.TopshelfService install
net start HelloTopShelf
pause
3.2、卸载服务
在Debug文件夹下面,创建一个"卸载服务.bat"的批处理文件:
@echo on
rem 设置DOS窗口的背景颜色及字体颜色
color 2f
rem 设置DOS窗口大小
mode con: cols=80 lines=25
@echo off
echo 请按任意键开始卸载LinkTo.Test.TopshelfService服务
rem 输出空行
echo.
pause
net stop HelloTopShelf
LinkTo.Test.TopshelfService uninstall
pause
3.3、查看服务
在运行中输入"services.msc"进入服务,即可看到新建的HelloTopshelf服务:
四、添加管理员权限要求
项目右键->添加->新建项->应用程序清单文件。
将requestedExecutionLevel节点的level设置为"requireAdministrator"。
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
来源:https://www.cnblogs.com/atomy/archive/2020/05/15/12893948.html
0
投稿
猜你喜欢
- 在基于UI元素的自动化测试中, 无论是桌面的UI自动化测试,还是Web的UI自动化测试. 首先我们需要查找和识别UI
- 最近项目中使用了 MyBatis-Plus,点击看官方文档。使用一个新的框架,首先是验证框架的使用。 使用 MyBatis-Plu
- 1.向上转型 向下转型2.强制类型转换的应用应用多态性时由于引用为父类类型,导致编译时只能调用父类中声明的属性和方法。子类特有的属性和方法不
- 在Android Studio中对一个自己库进行生成操作时将会同时生成*.jar与*.aar文件。分别存储位置: &n
- 一、递归的思路一个方法在执行时,调用自身被称为“递归”。递归相当于数学归纳法,有一个起始条件,有一个递推公式。递归可以分为:单路递归和多路递
- JMMJMM是指Java内存模型,不是Java内存布局,不是所谓的栈、堆、方法区。每个Java线程都有自己的工作内存。操作数据,首先从主内存
- 一 点睛注解若想发挥更大作用,还需借助反射机制之力。通过反射,可以取得一个方法上声明的注解的全部内容。一般有两种需求:1 
- 一、XSSFpackage com.yy.demo01;import java.io.FileInputStream;import java
- 问题之前一直使用Mybatis,最近尝试使用Mybatis-Plus,却在updateById登录成功后更新最近登录时间出现了问题,一般业务
- 目录一、Collections.sort的简单使用二、问题提出三、Comparable实现排序四、Comparator实现排序五、Compa
- 以Java web的方式显示图片到浏览器以Java web的方式下载服务器文件到浏览器以Spring Boot的方式显示图片或下载文件到浏览
- 1 编程语言简介编程语言(programming language)可以简单的理解为一种计算机和人都能识别的语言。一种计算机语言让程序员能够
- 因为公司现在换成了nacos,所以自己写了demo学习一下。结果第一步就走不下去。在使用nacos-config读取nacos配置时。发现b
- 前言前面一篇我们介绍了使用 shared_preferences实现简单的键值对存储,然而我们还会面临更为复杂的本地存储。比如资讯类 App
- 概述透视表是依据已有数据源来创建的交互式表格,我们可在excel中创建透视表,也可编辑已有透视表。所需工具:Free Spire.XLS f
- 本文实例为大家分享了java实现图书馆管理系统的具体代码,供大家参考,具体内容如下思路:所有包都在book_manage包里利用面向对象的多
- 在使用struts多模块的,找到一些小技巧和经验,与大家分享一下。 关于多module的配置就不说了,只需要用不同的config
- 在前面的《基于任务的异步编程模式(TAP)》文章中讲述了.net 4.5框架下的异步操作自我实现方式,实际上,在.net 4.5中部分类已实
- 今天想说的就是能够在我们操作数据库的时候更简单的更高效的实现,现成的CRUD接口直接调用,方便快捷,不用再写复杂的sql,带吗简单易懂,话不
- 参考链接亲测试以下版本成功激活附激活教程。idea下载链接(对应版本号下载):https://www.jetbrains.com/idea/