使用C#创建安装Windows服务程序

在实际工作中,如果我们需要开发一个运行在后台,无需用户交互,不需要界面的应用程序,我们可以通过Windows服务来实现。

本文主要介绍如何基于C#创建一个Windows服务,来实现西门子PLC的定时读取保存。

一、Windows服务说明

Windows 服务是一种特殊类型的应用程序,能够在系统启动时自动运行,且无需用户登录即可执行。

它适合于以下场景:

  • 持续运行的任务(如日志采集、网络代理等)

  • 系统后台维护(如自动更新、性能监控)

  • 需要在无人值守环境中执行的任务

Windows 服务的核心特性:

  • 通过服务控制管理器(SCM) 管理

  • 运行时与用户登录状态无关

  • 支持系统启动时自动运行

二、Windows服务创建

1、创建一个新项目,项目模板选择Windows服务(.Net Framework):

图片

2、项目名称为WindowsServiceDemo,项目创建完成后如下:

图片

3、修改服务名称为SiemensPLCService:

图片

4、在设计界面的空白处,右击弹窗中,选择添加安装程序:

图片

5、点击添加安装程序之后,会自动添加一个ProjectInstaller界面,里面有两个组件,分别是serviceProcessInstaller和serviceInstaller。

图片

6、选择serviceInstaller,在右侧的属性进行设置,主要可以设置以下属性:

  • ServiceName:服务名称

  • Description:服务描述

  • StartType:启动类型

图片

7、接着选择ProjectInstaller进行设置,主要设置Account,指示用来运行此服务的账户类型,可以设置为LocalSystem。

图片

8、设置完成之后,切换到SiemensPLCService这个类,点击切换到代码视图,我们可以看到后台有一些自动生成的代码:


public partial class SiemensPLCService : ServiceBase
{public SiemensPLCService(){InitializeComponent();}protected override void OnStart(string[] args){}protected override void OnStop(){}
}

    我们可以在OnStart和OnStop里写一些代码逻辑。

    9、写了一个简单的逻辑,就是每次服务启动或停止都会向指定的文件中写入一串信息。

    private Plc siemens;
    private CancellationTokenSource cts;
    protected override void OnStart(string[] args)
    {try{this.siemens = new Plc(CpuType.S7200Smart, "192.168.2.150", 0, 0);this.siemens.Open();cts = new CancellationTokenSource();Task.Run(async () =>{while (!cts.IsCancellationRequested){try{uint temp = Convert.ToUInt32(this.siemens.Read("DB1.DBD4"));float val = temp.ConvertToFloat();await Task.Delay(1000);WriteInfo("读取PLC数据:"+val.ToString("f2"));}catch (Exception ex){WriteInfo(ex.Message);}}this.siemens.Close();});}catch (Exception ex){WriteInfo(ex.Message);}
    }
    private string filePath = @"D:\ServiceLog.txt";
    private void WriteInfo(string info)
    {using (FileStream stream = new FileStream(filePath, FileMode.Append)){using (StreamWriter writer = new StreamWriter(stream)){writer.WriteLine($"{DateTime.Now},{info}");}}
    }
    protected override void OnStop()
    {this.siemens?.Close();
    }

      三、Windows服务安装卸载

      我们直接运行刚刚创建的服务,发现是无法运行的,提示如下:

      图片

      接下来,我们使用这个exe来进行安装和卸载Windows服务。

      1、首先,使用管理员权限打开cmd命令行,然后进入这个路径下,便于直接操作InstallUtil。

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

      图片

      2、安装服务命令:installutil  exe绝对路径 ;

      installutil C:\Users\Administrator\Desktop\WindowsServiceDemo\WindowsServiceDemo\bin\Debug\WindowsServiceDemo.exe

      图片

      打开服务,可以看到TestService这个名称的服务已经安装完成,

      图片

      3、安装完成后,双击打开,可以启动服务,也可以手动停止:

      图片

      4、观察D盘文件,可以看到PLC的数据每秒会存一次到指定文件中:

      图片

      5、需要卸载服务时,可以执行卸载服务命令:installutil  exe绝对路径 -u ;

      installutil C:\Users\Administrator\Desktop\WindowsServiceDemo\WindowsServiceDemo\bin\Debug\WindowsServiceDemo.exe -u

      图片

      本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/72885.shtml

      如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

      相关文章

      docker、docker-compose常用命令

      初学者使用的docker、docker-compose常用命令,日常练习,环境简单搭建。 一、docker 1.1、安装docker 1.1.1、yum安装 #安装docker的数据存储驱动包 yum install -y yum-utils device-mapper-persistent-data lvm2 #设置新的安装源、下载配置文件到…

      阿里的MNN源码如何编译成so文件,供Android调用

      在Ubtuntu下面的编译,先整理编译环境 1、安装环境依赖 # 安装必要工具 sudo apt update sudo apt install -y cmake ninja-build git wget # 安装Android NDK(建议使用r21版本或更高) wget https://dl.google.com/android/repository/a…

      吴恩达机器学习笔记复盘(六)梯度下降算法

      简介 梯度下降(Gradient Descent)是一种常用的优化算法,广泛应用于机器学习、深度学习等领域,在这里是用于求J(w,b)局部最小值。 我自己觉得这样说有点过于抽象。换个直观点的说法就是,一个人…

      使用JAVA-进行维吉尼亚密码的解密与加密

      维吉尼亚密码 来源于百度百科 维吉尼亚密码_百度百科 具体代码 import java.util.*;public class WJMYmm {//常量 26public static final int N 26;//密码public static void main(String[] args) {//字母String ZM"abcdefghijklmnopqrstuvwxyz";char[] zm ZM.…

      Java DelayQueue 延迟队列

      Java DelayQueue 延迟队列 1. DelayQueue 概述 DelayQueue 是 Java 并发包(java.util.concurrent)中的一个 无界 阻塞队列,用于存储实现了 Delayed 接口的元素。队列中的元素只有在达到指定的延迟时间后才能被获取。 2. DelayQueue 的底层…

      LeetCode 解题思路 22(Hot 100)

      解题思路: 递归思路: 传入当前节点的最小值和最大值,递归判断左右子树。结束条件: 当前节点为空或不满足二叉搜索树。 Java代码: class Solution {public boolean isValidBST(TreeNode root) {return isValidBST(ro…

      乐享数科:政策助推假日经济,2月普惠金融-景气指数稳中有升

      数据显示,2025年2月普惠金融-景气指数达48.99点,较1月上升0.03点。 企业运行持续向好,企业信心预期和经营活力回升。“假日经济”与“政策效应”相互叠加,市场供求格局有所改善,景气水平稳步恢复。 普惠金融-景气指数…

      leetcode日记(108)验证回文串

      看上去很简单,其实很麻烦。 一开始写的递归,但是内存超限……搜了下发现原因是每次递归调用都会创建一个新的字符串副本,这在处理长字符串时会占用大量内存。 class Solution { public:bool isPalindrome(string s) {if(s.size()0||s.size(…

      用css绘制收银键盘

      最近需求说需要自己弄个收银键盘&#xff0c;于是乎直接上手搓 主要基于Vue3写的&#xff0c;主要是CSS <template><view class"container"><view class"info"><image class"img" src"" mode"">&l…

      智能车间管理系统(源码+文档+讲解+演示)

      引言 在现代制造业中&#xff0c;智能车间管理系统正成为推动工业4.0和智能制造的关键力量。它通过整合先进的信息技术和自动化技术&#xff0c;优化生产流程&#xff0c;提高生产效率&#xff0c;降低成本&#xff0c;并确保产品质量。 系统概述 智能车间管理系统采用前后端…

      Model Context Protocol - Prompts

      1. 概述 Model Context Protocol (MCP) 提供了一种标准化的方式&#xff0c;使服务器能够向客户端暴露提示模板&#xff08;prompts&#xff09;。Prompts 是服务器提供的结构化消息和指令&#xff0c;用于与语言模型进行交互。客户端可以发现可用的提示、获取其内容&#xff…

      办公自动化:使用 Python 生成 Word 文件:自动生成数据库文档 Word 文件

      简简单单 Online zuozuo :本心、输入输出、结果 文章目录 办公自动化:使用 Python 生成 Word 文件:自动生成数据库文档 Word 文件前言一、环境准备二、编写代码三、编写 Word 模版文件接收数据四、运行代码,生成文件,大功告成五、说明办公自动化:使用 Python 生成 Word 文…

      嵌入式GPRS协议面试题及参考答案

      目录 GPRS 的全称是什么?简述其核心设计目标。 GPRS 中 DNS 服务器的核心作用是什么? BTS 在 EDGE 升级时需要哪些硬件调整? GPRS 的时隙分配策略如何影响多用户并发? 解释 PDCH(分组数据信道)的动态分配机制。 如何判断天馈接反或鸳鸯线问题? GPRS 的 RLC/MAC 层…

      Docker 内部通信(网络)

      1. 创建自定义桥接网络 首先&#xff0c;创建一个自定义的Docker网络。这可以通过docker network create命令完成。例如&#xff0c;我们可以创建一个名为my_custom_network的网络&#xff1a; docker network create --driver bridge my_custom_network2. 启动容器并连接到自…

      单片机开发资源分析的实战——以STM32F103C8T6为例子的单片机资源分析

      目录 第一点&#xff1a;为什么叫STM32F103C8T6 从资源手册拿到我们的对STM32F103C8T6的资源描述 第二件事情&#xff0c;关心我们的GPIO引脚输出 第三件事情&#xff1a;去找对应外设的说明部分 前言 本文章隶属于项目&#xff1a; Charliechen114514/BetterATK: This is…

      贪心算法(9)(java)最优除法

      题目&#xff1a; 给定一正整数数组 nums,nums中的相邻整数将进行浮点除法。例如&#xff0c;[2,3.4]->2/3/4. 例如&#xff0c;nums [2,3,4]&#xff0c;我们将求表达式的值“2/3/4"。 但是&#xff0c;你可以在任意位置添加任意数目的括号&#xff0c;来改变算…

      腾讯云MySQL数据库架构分析与使用场景

      TDSQL-C for MySQL TDSQL-C MySQL 版&#xff08;TDSQL-C for MySQL&#xff09;是腾讯云自研的新一代云原生关系型数据库。融合了传统数据库、云计算与新硬件技术的优势&#xff0c;为用户提供具备高弹性、高性能、海量存储、安全可靠的数据库服务。TDSQL-C MySQL 版100%兼容…

      荣耀手机卸载应用商店、快应用中心等系统自带的

      1.下载abd ADB Download - Get the latest version of ADB and fastboot 2.手机打开开发者选项 3.手机接电脑打开USB调试 4.下载MT管理器查看系统包名 D:\1.LFD\ADB\platform-tools-latest-windows\platform-tools>adb shell adb.exe: no devices/emulators found 这边是…

      星型拓扑网络发生网络风暴

      在星型拓扑网络中&#xff0c;所有的设备&#xff08;如计算机、打印机等&#xff09;通过一个中心设备&#xff08;通常是交换机或集线器&#xff09;连接在一起。 星型拓扑网络中发生网络风暴时的情况&#xff1a; 网络风暴的表现 1.广播风暴&#xff1a;在星型拓扑中&…

      网络流基本概念及实现算法

      基本概念 流网络 对于一个有向图, 抽象成水管里的水的模型, 每根管子有容量限制, 计为 G ( V , E ) G (V, E) G(V,E), 首先不考虑反向边 对于任意无向图, 都可以将反向边转化为上述形式 如果一条边不存在, 定义为容量为 0 0 0, 形式上来说就是 c ( u , v ) 0 c(u, v) 0 c(…