使用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.pswp.cn/pingmian/72885.shtml
      繁體地址,請注明出處:http://hk.pswp.cn/pingmian/72885.shtml
      英文地址,請注明出處:http://en.pswp.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(…