一、开发环境

操作系统:Windows 10 X64

开发环境:VS2015

编程语言:C#

.NET版本:.NET Framework 4.0

目标平台:X86

二、创建Windows Service

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

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

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

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},服务停止!");}}}
}

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

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

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

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

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

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

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

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

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

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

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();}}}}
}

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

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

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

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

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

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

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

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

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

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

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

源代码下载:

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

补充:如何调试服务

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

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

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

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


======================================================== 华丽的分割线  第二种方式 =======================================================
namespace WindowsService1
{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},服务启动!");for (int i = 0; i < 20; i++){Thread.Sleep(1000);writer.WriteLine("当前内容: "+ i );}}}}protected override void OnStop(){using (FileStream stream = new FileStream(filePath,FileMode.Append)){using (StreamWriter writer = new StreamWriter(stream)){writer.WriteLine($"{DateTime.Now},服务停止");}}}}
}


使用bat发布方式bat内容
cd C:\Windows\Microsoft.NET\Framework\v4.0.30319\
InstallUtil.exe InstallUtil D:\WindowsService1\bin\Debug\WindowsService1.exe   //服务项目地址
Net Start Service1
pause

其中C:\Windows\Microsoft.NET\Framework\v4.0.30319\为installutil的路径

WindowsServiceTest.exe为Windows Service服务的应用程序,教程

Service1为服务名

ps:.bat与WindowsService1.exe在同一路径

运行结果:

正在运行事务处理安装。正在开始安装的“安装”阶段。
查看日志文件的内容以获得 D:\WindowsService1\bin\Debug\WindowsService1.exe 程序集的进度。
该文件位于 D:\WindowsService1\bin\Debug\WindowsService1.InstallLog。
正在安装程序集“D:\WindowsService1\bin\Debug\WindowsService1.exe”。
受影响的参数是:logtoconsole =logfile = D:\WindowsService1\bin\Debug\WindowsService1.InstallLogassemblypath = D:\WindowsService1\bin\Debug\WindowsService1.exe
正在安装服务 MyService...
正在日志 Application 中创建 EventLog 源 MyService...在“安装”阶段发生异常。
System.Security.SecurityException: 未找到源,但未能搜索某些或全部事件日志。  不可访问的日志: Security。正在开始安装的“回退”阶段。
查看日志文件的内容以获得 D:\WindowsService1\bin\Debug\WindowsService1.exe 程序集的进度。
该文件位于 D:\WindowsService1\bin\Debug\WindowsService1.InstallLog。
正在回滚程序集“D:\WindowsService1\bin\Debug\WindowsService1.exe”。
受影响的参数是:logtoconsole =logfile = D:\WindowsService1\bin\Debug\WindowsService1.InstallLogassemblypath = D:\WindowsService1\bin\Debug\WindowsService1.exe
正在将事件日志还原到源 MyService 的前一状态。
在 System.Diagnostics.EventLogInstaller 安装程序的“回退”阶段发生异常。
System.Security.SecurityException: 未找到源,但未能搜索某些或全部事件日志。  不可访问的日志: Security。
在安装的“回退”阶段发生异常。将忽略该异常并继续回退。但是,在完成回退后计算机可能无法完全还原到它的初始状态。“回退”阶段已成功完成。已完成事务处理安装。
安装失败,已执行回退。

很明显了,是权限问题。

【解决方案】

右键管理员权限打开.bat文件

删除:

卸载很简单,打开cmd, 直接输入 sc delete WindowsService1 便可(要以管理员身份运行)否则结果如下

参考:https://www.cnblogs.com/cncc/p/7170951.html

转载于:https://www.cnblogs.com/youmingkuang/p/10069363.html

使用C#创建Windows服务 并发布Windows 服务相关推荐

  1. 什么是WFS服务,发布WFS服务有什么用

    WFS 服务 可以发布符合开放地理空间联盟 (OGC) Web 要素服务 (WCS) 规范的服务.WFS 是通过 Web 提供地理要素服务的开放规范. 官网上是这么描述的,但还是对其概念了解不太清除, ...

  2. Windows 下面 redis 发布为服务的官方方法

    除了 NSSM 之外 另外一种方式感觉还是很好用的 redis-server --service-install redis.windows.conf --loglevel verbose感觉也可以 ...

  3. WCF开发实战系列四:使用Windows服务发布WCF服务

    WCF开发实战系列四:使用Windows服务发布WCF服务 (原创:灰灰虫的家http://hi.baidu.com/grayworm) 上一篇文章中我们通过编写的控制台程序或WinForm程序来为本 ...

  4. ArcMap通过服务定义发布服务

    近期发布影像数据,发布一天,提示[ArcGIS Server发布服务,打包成功,发布失败],很是痛苦.后发现通过服务定义发布服务又快又不会出错简直不要太棒! 1.创建服务定义文件 打开 ArcMap ...

  5. ArcSDE与SQL sevrver的连接、ArcSDE导入数据、ArcGIS Server发布地图服务

    本文主要是关于ArcSDE的使用. 一.软件环境 ArcGIS10.2,ArcSDE10.2,数据库为SQL Server 2008R2 及以后版本(本人电脑上是2012版本). 二.软件安装 1.S ...

  6. 如何发布webservice服务端

    如何发布webservice服务端 还是使用jdk提供的工具进行webservice进行发布(从jdk1.6以后)对soap1.2协议支持的不是很好 使用Endpoint里面的publish方法进行发 ...

  7. C#/.NET基于Topshelf创建Windows服务的守护程序作为服务启动的客户端桌面程序不显示UI界面的问题分析和解决方案

    C#/.NET基于Topshelf创建Windows服务的守护程序作为服务启动的客户端桌面程序不显示UI界面的问题分析和解决方案 参考文章: (1)C#/.NET基于Topshelf创建Windows ...

  8. 日志服务发布Windows Logtail,完整支持两大平台

    Windows Logtail发布 日志服务支持客户端.网页.Syslog.SDK/API等方式接入数据,参考. Linux平台上的Logtail客户端拥有优秀的性能和良好的接入体验,在解决跨平台兼容 ...

  9. 创建寄宿在Windows服务中的WCF服务

    1.创建Windows服务项目 2.Server1改名为你想要的名称,比如WinServer 3.在项目中新建一个WCF文件夹,用于存放wcf服务文件. 注:在WcfServer类的上面还要添加 [S ...

最新文章

  1. 脑机接口中的后门攻击
  2. 大数据应用开发八大基本原则
  3. 如何使用pFuzz以多种方法验证Web应用程序防火墙的安全性
  4. enum-使用宏管理你的枚举型数据
  5. 什么是压缩感知?[简单概括]
  6. php怎么和数据库通信,php – 如何处理域和数据库层之间的通信?
  7. 教师进修学校计算机教学反思,优秀教学反思
  8. 怎样使用计算机上的高级共享设置,win7打印机共享怎么设置
  9. SpringBoot多跨域请求的支持(JSONP)
  10. PHPSTORM插件
  11. win10硬盘锁怎么解除_win10如何使用bitlocker解锁硬盘加密
  12. 『UVA 437』巴比伦塔
  13. 基于ZEGO SDK实现多人视频通话功能
  14. Linux配置访问服务器图片路径(防止踩坑)
  15. python将三位数分离(format格式)_Python格式函数,python,之,format
  16. 【高数】高数第六章节——平面图形的面积旋转体体积平面截面体体积平面曲线的弧长定积分在物理学中的应用
  17. 常见的配置中心:Apollo(二)-接入Apollo
  18. java-net-php-python-ssm高校学生学业分析及预警系统查重PPT计算机毕业设计程序
  19. 详解图像二值化 函数threshold
  20. 下载安装钱德拉望远镜的软件CIAO

热门文章

  1. servlet 开发入门生命周期
  2. printf参数的问题
  3. DEDE常见的错误(转)
  4. 正则表达式的先行断言(lookahead)和后行断言(lookbehind)
  5. SystemCenter2012SP1实践(0)本系列摘要目录
  6. Windows Serer2003域升级到Windows Server2008R2域
  7. 计算机程序的构造和解释1构造过程抽象1.2过程与它们所产生的计算
  8. python tkinter 基本用法
  9. PostgreSQL pg中的截取补齐lpad函数怎么用?
  10. java策略模式 工厂模式_策略模式和工厂模式搭配使用