C# 创建Windows服务demo
一、准备工作
1.操作系统:Windows 10 X64
2.开发环境:VS2017
3.编程语言:C#
4. .NET版本:.NET Framework 4.5
二、创建Windows Service
1.新建一个Windows Service,并将项目名称改为“MyWinsService”,程序保存路径自己选一个,如下图所示:

2、在解决方案资源管理器内将Service1.cs改为MyService1.cs后,右键“查看代码”图标按钮进入代码编辑器界面,下面直接贴代码:
     string filePath = $"{Application.StartupPath}\\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 + " " + "停止服务!");
            }
        }
3.双击项目“MyWindowsService”进入“MyService”设计界面,在空白位置右击鼠标弹出上下文菜单,选中“添加安装程序”,如下图所示:

4、进入页面之后就会看到serviceProcessInstaller1和serviceInstaller1;
点击“serviceProcessInstaller1”,在“属性”窗体将Account改为LocalSystem(服务属性系统级别),如下图所示:

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

6.鼠标右键点击项目“MyWinsService”,在弹出的上下文菜单中选择“生成”按钮,生成我们自己的windows服务了。
三、创建安装、启动、停止、卸载服务的Windows窗体
1.我们以winform为例子吧,建一个简单的界面,这里命名为ServiveMan,修改属性text为windows服务管理,拖入四个Button,分别命名为安装、启动、停止、卸载

2.整理了一个Windows服务管理的类,这里我采用的是单例模式,如果有不理解的,我下一篇文章就分享一下单例模式。
/// <summary>
/// Windows服务管理
/// </summary>
public class serviceManager
{
private static serviceManager mSingle = null;
//
public static serviceManager GetInstance()
{
if (mSingle == null)
mSingle = new serviceManager();
return mSingle;
}
//判断服务是否存在
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();
}
}
}
}
3.接下来贴,windows服务管理类的使用方法,直接看代码,代码上都有注释
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
string serviceFilePath = $"{Application.StartupPath}\\MyWindowsService.exe";
string serviceName = "MyService"; /// <summary>
/// 事件:安装服务
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
//判断是否存在服务 - 存在则开启服务
if (serviceManager.GetInstance().IsServiceExisted(serviceName))
{
try
{
serviceManager.GetInstance().ServiceStart(serviceName); //启动服务
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
serviceManager.GetInstance().InstallService(serviceFilePath);//否则安装服务
} /// <summary>
/// 事件:启动Windows服务
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
//启动Windows服务前判断是否存在Windows服务
if (serviceManager.GetInstance().IsServiceExisted(serviceName))
{
try
{
serviceManager.GetInstance().ServiceStart(serviceName);//开启Windows服务
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
else
{
//服务未安装
DialogResult dr = MessageBox.Show("该服务尚未安装,是否安装服务?", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
if (dr == DialogResult.OK)
{
serviceManager.GetInstance().InstallService(serviceFilePath);//安装服务
}
else
{
return;
}
}
} /// <summary>
/// 事件:停止Windows服务
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button3_Click(object sender, EventArgs e)
{
if (serviceManager.GetInstance().IsServiceExisted(serviceName))
{
try
{
serviceManager.GetInstance().ServiceStop(serviceName);//停止Windows服务
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
} /// <summary>
/// 事件:卸载Windows服务
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button4_Click(object sender, EventArgs e)
{
if (serviceManager.GetInstance().IsServiceExisted(serviceName))
{
serviceManager.GetInstance().ServiceStop(serviceName);//停止Windows服务
serviceManager.GetInstance().UninstallService(serviceFilePath);//卸载Windows服务
}
}
}
4、为了后续调试服务及安装卸载服务的需要,将已生成的MyWinsService.exe引用到本Windows窗体,右键添加引用,选择项目添加就可以了。这里就不上图了。
5. 安装服务,需要使用UAC中Administrator的权限,鼠标右击项目,在弹出的上下文菜单中选择“添加”->“新建项”,在弹出的选择窗体中选择“应用程序清单文件”并单击确定,如下图所示:

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

6.整个过程完成了,现在我们可以启动项目了,启动后可能会弹出如下所示的窗体(有的系统因UAC配置有可能不显示),需要用管理员权限打开:

7.重启项目之后就可以了。
8、使用WIN+R的方式打开运行窗体,并在窗体内输入services.msc后打开服务,就可以看到下图:

9.我们可以通过刚刚写的开启服务来打开服务,如果服务不用了可以通过按钮直接停止或者卸载。

ok,今天关于windows服务的demo就分享到这了,如果有疑问的可以留言,讲的不对的欢迎指出!!!
C# 创建Windows服务demo的更多相关文章
- 常量,字段,构造方法  调试 ms 源代码  一个C#二维码图片识别的Demo  近期ASP.NET问题汇总及对应的解决办法  c# chart控件柱状图,改变柱子宽度  使用C#创建Windows服务  C#服务端判断客户端socket是否已断开的方法  线程 线程池 Task  .NET 单元测试的利剑——模拟框架Moq
		
常量,字段,构造方法 常量 1.什么是常量  常量是值从不变化的符号,在编译之前值就必须确定.编译后,常量值会保存到程序集元数据中.所以,常量必须是编译器识别的基元类型的常量,如:Boolean ...
 - .Net创建windows服务入门
		
本文主要记录学习.net 如何创建windows服务. 1.创建一个Windows服务程序 2.新建安装程序 3.修改service文件 代码如下 protected override void On ...
 - VS2013创建Windows服务与调试服务
		
1.创建Windows服务 说明: a)Description 服务描述,直接显示到Windows服务列表中的描述: b)DisplayName 服务显示名称,直接显示到Windows服务列表中的名称 ...
 - 用C#创建Windows服务(Windows Services)
		
用C#创建Windows服务(Windows Services) 学习: 第一步:创建服务框架 创建一个新的 Windows 服务项目,可以从Visual C# 工程中选取 Windows 服务(W ...
 - 玩转Windows服务系列——创建Windows服务
		
创建Windows服务的项目 新建项目->C++语言->ATL->ATL项目->服务(EXE) 这样就创建了一个Windows服务项目. 生成的解决方案包含两个项目:Servi ...
 - C# 创建Windows服务
		
创建windows服务项目 2 右键点击Service1.cs,查看代码, 用于编写操作逻辑代码 3 代码中OnStart用于执行服务事件,一般采用线程方式执行方法,便于隔一段事件执行一回 END ...
 - 使用Topshelf创建Windows服务
		
概述 Topshelf是创建Windows服务的另一种方法,老外的一篇文章Create a .NET Windows Service in 5 steps with Topshelf通过5个步骤详细的 ...
 - [转]C#创建Windows服务与安装
		
本文档用于创建windows服务说明,使用vs2010系统平台 创建项目 1 创建windows服务项目 2 右键点击Service1.cs,查看代码, 用于编写操作逻辑代码 3 代码中OnStart ...
 - [Solution] Microsoft Windows 服务(2) 使用Topshelf创建Windows服务
		
除了通过.net提供的windows服务模板外,Topshelf是创建Windows服务的另一种方法. 官网教程:http://docs.topshelf-project.com/en/latest/ ...
 
随机推荐
- XF 显示网络图像
			
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
 - WPF 过滤集合
			
<Window x:Class="ViewExam.MainWindow" xmlns="http://schemas.microsoft.com/w ...
 - Cordova页面加载外网图片失败,Refused to load the image
			
原文:Cordova页面加载外网图片失败,Refused to load the image 1.使用Cordova页面加载外网图片失败,抛出异常 Refused to load the image ...
 - WPF获取和设置应用程序范围的资源
			
设置资源: Application.Current.Resources["ApplicationScopeResource"] = Brushes.White; 使用代码获取资源: ...
 - C#中??操作符的使用
			
为了实现Nullable数据类型转换成non-Nullable型数据,就有了一个这样的操作符”??(两个问号)“,双问号操作符意思是取所赋值??左边的,如果左边为null,取所赋值??右边的, 比如i ...
 - 1.预处理,生成预编译文件(.文件):          Gcc –E hello.c –o hello.i     2.编译,生成汇编代码(.s文件):          Gcc –S hello.i –o hello.s     3.汇编,生成目标文件(.o文件):         Gcc –c hello.s –o hello.o     4.链接,生成可执行文件:  linux笔记
			
1 动态查看日志 tail -f filename tail -1000f filename 2 解压当前目录内容为xxx.zip zip -r xxx.zip ./* 3 查看内存使用情况 fre ...
 - Dec Working Note
			
01 新的一个月,也是16年最后一个月,意义非凡. 那么第一天就要来点非凡的意义:提出离职. 纠结了好久,最后还是离职了,感觉是好他妈的爽,纠结什么呢. 不过今天状态不好,最近状态一直不好,上火,也没 ...
 - WPF Aero Glass Window
			
原文:WPF Aero Glass Window 用法 Win7 DwmSetWindowAttribute function Win10 SetWindowCompositionAttribute ...
 - WebApi 中FromUri参数自动解析成实体的要求
			
条件一:类属性名称必须和参数名称相同(不分大小写) 条件二:API参数必须以[FromUri]来修饰(数组也需要添加,否则参数传递不了) 条件三:属性类型为“类”的,如果使用类名(导航属性在本类的名称 ...
 - 我写的一个Qt 显示二维码( QR Code)的控件(可以去掉对 libpthread 的依赖,而且编译出的库文件可以在 vc2010 的release 模式下使用)
			
最近一个项目需要显示二维码,所以花了点时间(只用了一个晚上,写的很不完善),写了个显示二维码的控件.当然这个控件用到了些开源的代码,比如qrencode,所以我也打算把我的代码开源. 我的代码参考了 ...