C#创建服务及使用程序自动安装服务,.NET创建一个即是可执行程序又是Windows服务的exe
不得不说,.NET中安装服务很麻烦,即要创建Service,又要创建ServiceInstall,最后还要弄一堆命令来安装和卸载。
今天给大家提供一种方式,直接使用我们的程序来安装/卸载服务,并且可以让一个exe即能直接运行也行安装为windows服务
首先我们创建一个Windows应用程序,(我创建的是控制台程序,WinForm也一样)
接下来在项目中添加一个Windows服务类
然后双击“MainService.cs”,在上面点右键“打开代码”
这里面写服务的具体实现,以下是我写的示例代码
- partial class MainService : ServiceBase
- {
- public MainService()
- {
- InitializeComponent();
- }
- protected override void OnStart(string[] args)
- {
- // TODO: 在此处添加代码以启动服务。
- System.IO.File.AppendAllText("D:\\log.txt", "服务已启动……" + DateTime.Now.ToString());
- }
- protected override void OnStop()
- {
- // TODO: 在此处添加代码以执行停止服务所需的关闭操作。
- System.IO.File.AppendAllText("D:\\log.txt", "服务已停止……" + DateTime.Now.ToString());
- }
- }
然后我们改程序入口Main方法,让其在启动时识别是Windows应用程序还是Windows服务,如果是应用程序就执行应用程序的代码,如果是服务就执行MainService的代码
如果是服务,我给了一个"s"参数,如果有这个参数就证明是Windows服务,然后启动MainService
- static void Main(string[] args)
- {
- //如果传递了"s"参数就启动服务
- if (args.Length > && args[] == "s")
- {
- //启动服务的代码,可以从其它地方拷贝
- ServiceBase[] ServicesToRun;
- ServicesToRun = new ServiceBase[]
- {
- new MainService(),
- };
- ServiceBase.Run(ServicesToRun);
- }
- else
- {}
然后,我们再实现应用程序的功能,就是上面的else语句块,应用程序的功能就是安装/卸载服务,可以用windows自带的sc命令来进行安装和卸载,具体代码如下:
- Console.WriteLine("这是Windows应用程序");
- Console.WriteLine("请选择,[1]安装服务 [2]卸载服务 [3]退出");
- var rs = int.Parse(Console.ReadLine());
- switch (rs)
- {
- case :
- //取当前可执行文件路径,加上"s"参数,证明是从windows服务启动该程序
- var path = Process.GetCurrentProcess().MainModule.FileName + " s";
- Process.Start("sc", "create myserver binpath= \"" + path + "\" displayName= 我的服务 start= auto");
- Console.WriteLine("安装成功");
- Console.Read();
- break;
- case :
- Process.Start("sc", "delete myserver");
- Console.WriteLine("卸载成功");
- Console.Read();
- break;
- case : break;
- }
这样我们就实现了一个即是可执行程序又是Windows服务的应用程序
Main方法完整代码如下
- static void Main(string[] args)
- {
- if (args.Length > && args[] == "s")
- {
- ServiceBase[] ServicesToRun;
- ServicesToRun = new ServiceBase[]
- {
- new MainService(),
- };
- ServiceBase.Run(ServicesToRun);
- }
- else
- {
- Console.WriteLine("这是Windows应用程序");
- Console.WriteLine("请选择,[1]安装服务 [2]卸载服务 [3]退出");
- var rs = int.Parse(Console.ReadLine());
- switch (rs)
- {
- case :
- //取当前可执行文件路径,加上"s"参数,证明是从windows服务启动该程序
- var path = Process.GetCurrentProcess().MainModule.FileName + " s";
- Process.Start("sc", "create myserver binpath= \"" + path + "\" displayName= 我的服务 start= auto");
- Console.WriteLine("安装成功");
- Console.Read();
- break;
- case :
- Process.Start("sc", "delete myserver");
- Console.WriteLine("卸载成功");
- Console.Read();
- break;
- case : break;
- }
- }
- }
至此,程序已基本写完,接下来我们测试一下
直接双击ServiceOrApp.exe
输入 1
提示安装成功,然后运行“services.msc"打开服务管理器
可以发现我们的服务已安装成功,然后右键启动服务
成功启动
然后去D盘看看log.txt
说明服务执行正常
我们再停止服务
成功停止后再看看D盘的log.txt文件
看到以上内容,说明服务启动和停止都没问题(忘了输出换行符 - -!)
然后我们再试一下卸载服务,还是双击ServiceOrApp.exe,选择2
提示卸载成功,然后再运行“services.msc"打开服务管理器
可以看到已经没有”我的服务“了,已成功卸载
这里安装和卸载主要运用了windows的sc命令,然后使用启动参数来判断是服务还是程序以执行不同的代码
C#创建服务及使用程序自动安装服务,.NET创建一个即是可执行程序又是Windows服务的exe的更多相关文章
- [转]C#创建服务及使用程序自动安装服务,.NET创建一个即是可执行程序又是Windows服务的exe
写在前面 原文地址:C#创建服务及使用程序自动安装服务,.NET创建一个即是可执行程序又是Windows服务的exe 这篇文章躺在我的收藏夹中有很长一段时间了,今天闲着没事,就自己动手实践了一下.感觉 ...
- .NET创建一个即是可执行程序又是Windows服务的程序
不得不说,.NET中安装服务很麻烦,即要创建Service,又要创建ServiceInstall,最后还要弄一堆命令来安装和卸载. 今天给大家提供一种方式,直接使用我们的程序来安装/卸载服务,并且可以 ...
- C#创建服务及使用程序自动安装服务
.NET创建一个即是可执行程序又是Windows服务的exe 不得不说,.NET中安装服务很麻烦,即要创建Service,又要创建ServiceInstall,最后还要弄一堆命令来安装和卸载. 今天给 ...
- Topshelf一个用于使用.NET构建Windows服务框架
1 Topshelf是什么? Topshelf是用于托管使用.NET框架编写的Windows服务的框架.服务的创建得到简化,从而使开发人员可以创建一个简单的控制台应用程序,可以使用Topshelf将其 ...
- 可以自动安装mysql数据库的一个shell脚本
发布:thatboy 来源:脚本学堂 [大 中 小] 分享一例shell脚本,可以实现mysql数据库的自动安装,脚本写的不错,无论是用来学习,还是生产环境中应用,都是不错的,有需要的朋友 ...
- C#程序自动安装数字证书
using System.Security.Cryptography.X509Certificates; MessageBox.Show("开始"); //添加个人证书 X509C ...
- Quartz.Net在windows服务中的使用
写在前面 这几天在弄一个项目,需要定时抓取一些数据,当时也想直接用timer算了.因为之前也弄过这样的项目,但是一想,已经用过了,再去使用同一种思路,未免太乏味了.就换了一种新玩法.这里将之前看到的一 ...
- 定时执行exe、windows任务计划、windows服务
环境: Windows10 + VS2015 + SQL Server2014 + .NET Framework4.5 + C# + WCF 问题: 业务功能需要,做了一个windows应用程序供主程 ...
- c#创建、安装、卸载、调试windows服务的简单事例
最近工作中用到了windows服务,对其有深刻理解和丰富经验谈不上,本篇文章只是简单陈诉用c#创建.安装.卸载.调试windows服务的步骤. 一.创建windows服务 1.用VS创建windows ...
随机推荐
- android studio logcat 换行(日志换行)
起因 今天突然要调试网络数据,调试一大截那个xml数据. 解决思路 一开始去setting哪里看一下logcat 是否有line break,类似的字眼,可惜没有. 我猜如果没有在设置的话,估计就在“ ...
- 【转】APP被苹果App Store拒绝的N个原因(持续补充)
作为iOS开发者,估计有很多都遇到过APP提交到App Store被拒,然后这些被拒的原因多种多样,今天dApps收集了常见的被拒的原因,以便更多开发者了解. 1.程序有重大bug,程序不能启动,或者 ...
- timer.scheduleAtFixedRate和timer.schedule的实验
基础代码: Calendar currentTime = Calendar.getInstance(); currentTime.setTime(new Date()); int currentH ...
- C# Use Pop3Client to read gmail
host = "pop.gmail.com" user = "xxxxx@gmail.com" password = "xxxx" port ...
- [初读笔记] Cloud Migration Research: A Systematic Review (TCC, 2013)
Pooyan Jamshidi, Aakash Ahmad, Claus Pahl, "Cloud Migration Research: A Systematic Review," ...
- UDP网络通信OSC 协议
使用方法 ofxOscMessage mesg; mesg.setAddress("m"); mesg.addIntArg(); mesg.addIntArg(); mesg.ad ...
- Untracked files不想add
$ git status On branch feature/20160420_complain_630222 Untracked files: (use "git add <file ...
- ZooKeeper与Curator注册和监控
Curator提供了对zookeeper客户端的封装,并监控连接状态和会话session,特别是会话session过期后,curator能够重新连接zookeeper,并且创建一个新的session. ...
- 墓地雕塑-LA3708
https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=20& ...
- POJ 1012 Joseph
Joseph Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 44650 Accepted: 16837 Descript ...