使用C#创建Windows服务(使用c++的桌面开发)

一、开发环境

操作系统:Windows 10 X64

开发环境:VS2015

编程语言:C#

.NET版本:.NET Framework 4.0

目标平台:X86

二、创建Windows Service

1、新建一个Windows Service,并将项目名称改为“MyWindowsService”,如下图所示:

使用C#创建Windows服务(使用c++的桌面开发)

2、在解决方案资源管理器内将Service1.cs改为MyService1.cs后并点击“查看代码”图标按钮进入代码编辑器界面,如下图所示:

使用C#创建Windows服务(使用c++的桌面开发)

3、在代码编辑器内输入以下代码,如下所示:

使用C#创建Windows服务(使用c++的桌面开发)

using System;using System.ServiceProcess;using System.IO;namespace MyWindowsService{ public partial class MyService : ServiceBase { public MyService() { InitializeComponent(); } string filePath = @"D:MyServiceLog.txt"; protected overrIDE void OnStart(string[] args) { using (FileStream stream = new FileStream(filePath,FileMode.Append)) using (StreamWriter writer = new StreamWriter(stream)) { writer.WriteLine($"{DateTime.Now},服务启动!"); } } protected override void OnStop() { using (FileStream stream = new FileStream(filePath, FileMode.Append)) using (StreamWriter writer = new StreamWriter(stream)) { writer.WriteLine($"{DateTime.Now},服务停止!"); } } }}

使用C#创建Windows服务(使用c++的桌面开发)

4、双击项目“MyWindowsService”进入“MyService”设计界面,在空白位置右击鼠标弹出上下文菜单,选中“添加安装程序”,如下图所示:

使用C#创建Windows服务(使用c++的桌面开发)

5、此时软件会生成两个组件,分别为“serviceInstaller1”及“serviceProcessInstaller1”,如下图所示:

使用C#创建Windows服务(使用c++的桌面开发)

6、点击“serviceInstaller1”,在“属性”窗体将ServiceName改为MyService,Description改为我的服务,StartType保持为Manual,如下图所示:

使用C#创建Windows服务(使用c++的桌面开发)使用C#创建Windows服务(使用c++的桌面开发)使用C#创建Windows服务(使用c++的桌面开发)

7、点击“serviceProcessInstaller1”,在“属性”窗体将Account改为LocalSystem(服务属性系统级别),如下图所示:

使用C#创建Windows服务(使用c++的桌面开发)

8、鼠标右键点击项目“MyWindowsService”,在弹出的上下文菜单中选择“生成”按钮,如下图所示:

使用C#创建Windows服务(使用c++的桌面开发)

9、至此,Windows服务已经创建完毕。

三、创建安装、启动、停止、卸载服务的Windows窗体

1、在同一个解决方案里新建一个Windows Form项目,并命名为WindowsServiceClient,如下图所示:

使用C#创建Windows服务(使用c++的桌面开发)

2、将该项目设置为启动项目,并在窗体内添加四个按钮,分别为安装服务、启动服务、停止服务及卸载服务,如下图所示:

使用C#创建Windows服务(使用c++的桌面开发)

3、按下F7进入代码编辑界面,引用“System.ServiceProcess”及“System.Configuration.Install”,并输入如下代码:

使用C#创建Windows服务(使用c++的桌面开发)

using System;using System.Collections;using System.Windows.Forms;using System.ServiceProcess;using System.Configuration.Install;namespace WindowsServiceClient{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } string serviceFilePath = $"{Application.StartupPath}MyWindowsService.exe"; string serviceName = "MyService"; //事件:安装服务 private void button1_Click(object sender, EventArgs e) { if (this.IsServiceExisted(serviceName)) this.UninstallService(serviceName); this.InstallService(serviceFilePath); } //事件:启动服务 private void button2_Click(object sender, EventArgs e) { if (this.IsServiceExisted(serviceName)) this.ServiceStart(serviceName); } //事件:停止服务 private void button4_Click(object sender, EventArgs e) { if (this.IsServiceExisted(serviceName)) this.ServiceStop(serviceName); } //事件:卸载服务 private void button3_Click(object sender, EventArgs e) { if (this.IsServiceExisted(serviceName)) { this.ServiceStop(serviceName); this.UninstallService(serviceFilePath); } } //判断服务是否存在 private bool IsServiceExisted(string serviceName) { ServiceController[] services = ServiceController.GetServices(); foreach (ServiceController sc in services) { if (sc.ServiceName.ToLower() == serviceName.ToLower()) { return true; } } return false; } //安装服务 private void InstallService(string serviceFilePath) { using (AssemblyInstaller installer = new AssemblyInstaller()) { installer.UseNewContext = true; installer.Path = serviceFilePath; IDictionary savedState = new Hashtable(); installer.Install(savedState); installer.Commit(savedState); } } //卸载服务 private void UninstallService(string serviceFilePath) { using (AssemblyInstaller installer = new AssemblyInstaller()) { installer.UseNewContext = true; installer.Path = serviceFilePath; installer.Uninstall(null); } } //启动服务 private void ServiceStart(string serviceName) { using (ServiceController control = new ServiceController(serviceName)) { if (control.Status == ServiceControllerStatus.Stopped) { control.Start(); } } } //停止服务 private void ServiceStop(string serviceName) { using (ServiceController control = new ServiceController(serviceName)) { if (control.Status == ServiceControllerStatus.Running) { control.Stop(); } } } }}

使用C#创建Windows服务(使用c++的桌面开发)

4、为了后续调试服务及安装卸载服务的需要,将已生成的MyWindowsService.exe引用到本Windows窗体,如下图所示:

使用C#创建Windows服务(使用c++的桌面开发)

5、由于需要安装服务,故需要使用UACAdministrator的权限,鼠标右击项目“WindowsServiceClient”,在弹出的上下文菜单中选择“添加”->“新建项”,在弹出的选择窗体中选择“应用程序清单文件”并单击确定,如下图所示:

使用C#创建Windows服务(使用c++的桌面开发)

6、打开该文件,并将<requestedExecutionLevel level="asInvoker" uiAccess="false" />改为<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />,如下图所示:

使用C#创建Windows服务(使用c++的桌面开发)

7、IDE启动后,将会弹出如下所示的窗体(有的系统因UAC配置有可能不显示),需要用管理员权限打开:

使用C#创建Windows服务(使用c++的桌面开发)

8、重新打开后,在IDE运行WindowsServiceClient项目;

9、使用WIN R的方式打开运行窗体,并在窗体内输入services.msc后打开服务,如下图所示:

使用C#创建Windows服务(使用c++的桌面开发)

10、点击窗体内的“安装服务”按钮,将会在服务中出现MyService,如下图所示:

使用C#创建Windows服务(使用c++的桌面开发)

11、点击“运行服务”按钮,将启动并运行服务,如下所示:

使用C#创建Windows服务(使用c++的桌面开发)

12、点击“停止服务”按钮,将会停止运行服务,如下图所示:

使用C#创建Windows服务(使用c++的桌面开发)

13、点击“卸载服务”按钮,将会从服务中删除MyService服务。

14、以上启动及停止服务将会写入D:MyServiceLog.txt,内容如下所示:

使用C#创建Windows服务(使用c++的桌面开发)

源代码下载:

http://pan.baidu.com/s/1kVza3Bp

补充:如何调试服务

1、要调试服务,其实很简单,如需将服务附加进程到需要调试的项目里面即可,假如要调试刚才建的服务,现在OnStop事件里设置断点,如下所示:

使用C#创建Windows服务(使用c++的桌面开发)

2、启动“WindowsServiceClient”项目,在“调试”菜单中选择“附件到进程”(服务必须事先安装),如下所示:

使用C#创建Windows服务(使用c++的桌面开发)

3、找到“MyWindowsService.exe”,点击“附加”按钮,如下图所示:

使用C#创建Windows服务(使用c++的桌面开发)

4、点击“停止服务”按钮,程序将会在设置断点的地方中断,如下图所示:

使用C#创建Windows服务(使用c++的桌面开发)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

(0)
上一篇 2023年4月21日 上午10:16
下一篇 2023年4月21日 上午10:32

相关推荐

  • pjman项目管理软件

    pjman项目管理软件介绍 pjman项目管理软件是一款功能强大且易于使用的项目管理软件,可以帮助团队更好地管理项目进度、预算和资源。本文将介绍pjman项目管理软件的特点和优势。…

    科研百科 2024年8月15日
    19
  • 合同管理登记表怎么做

    合同管理登记表是一份非常重要的文件,它可以帮助公司或组织更好地管理合同,并确保合同的有效性和合规性。以下是一些制作合同管理登记表的建议: 1. 确定表单结构和内容:合同管理登记表应…

    科研百科 2024年9月20日
    16
  • 盘点12个低代码开源项目(盘点12个低代码开源项目的软件)

    大家好,我是 Echa。 低代码是基于可视化和模型驱动理念,结合云原生与多端体验技术,它能够在多数业务场景下实现大幅度的提效降本,为专业开发者提供了一种全新的高生产力开发范式。下面…

    科研百科 2024年5月14日
    75
  • 高级项目管理师cpmp

    高级项目管理师cpmp 项目管理作为现代商业中至关重要的一部分,对于企业的成功至关重要。高级项目管理师( cpmp )作为项目管理专业人士,需要具备丰富的项目管理经验和技能,以便为…

    科研百科 2024年7月25日
    43
  • 科研项目查询平台(科研项目查询平台官网)

    哈喽大家好,又到了小岚学姐的学术时间。 最近很奇怪哈,有很多准研究生们扎堆儿给小岚学姐留言,说怎么选导师,尤其是怎么通过科研项目来看导师能力,可谓是被小伙伴们问的五花八门。 那么,…

    科研百科 2024年4月8日
    43
  • 电商小程序怎么做?分享快速上手制作教程,新手必看(如何制作电商小程序)

    互联网时代,大家都已习惯于线上消费,各大电商平台也都拥有庞大的用户群体。然而,对于大多数电商商家来说,额外的推广费用或广告费用是他们不想承担的,因此有部分商家开始寻找新的线上获客销…

    科研百科 2024年5月10日
    77
  • 嵊州协同办公系统

    嵊州协同办公系统: 让办公更高效 随着数字化时代的到来,协同办公系统成为了现代企业不可或缺的一部分。嵊州协同办公系统则是嵊州地区一家知名互联网公司为了提升企业工作效率而开发的一款高…

    科研百科 2024年9月22日
    13
  • 速看!成昆铁路复线最新进展来了(成昆铁路复线最新进展情况)_1

    10月28日12时16分,在成昆铁路扩能工程(以下简称成昆铁路复线)喜德县小相岭隧道铺轨施工现场,随着最后一对500米长钢轨稳稳落下,标志着成昆铁路复线全线铺轨完成,为实现全线通车…

    科研百科 2022年12月22日
    103
  • 四川省大竹县人民医院战略绩效及人力资源方案顺利提交

    一、项目背景 大竹县人民医院始建于1940年,历经80年的积淀现已发展成为集医疗、教学、科研、健康管理与促进为一体的国家三级甲等综合医院,同时也是川北医学院直管附属教学医院。医院占…

    2022年9月13日
    227
  • crm定制软件开发

    CRM定制软件开发:提升企业管理效率的利器 随着信息技术的不断发展,企业管理面临着越来越多的挑战。为了提高企业管理效率,许多企业开始寻求CRM定制软件开发的解决方案。CRM定制软件…

    科研百科 2024年2月23日
    111