不得不说,.NET中安装服务很麻烦,即要创建Service,又要创建ServiceInstall,最后还要弄一堆命令来安装和卸载。

今天给大家提供一种方式,直接使用我们的程序来安装/卸载服务,并且可以让一个exe即能直接运行也行安装为windows服务


首先我们创建一个Windows应用程序,(我创建的是控制台程序,WinForm也一样)

接下来在项目中添加一个Windows服务类

然后双击“MainService.cs”,在上面点右键“打开代码”

这里面写服务的具体实现,以下是我写的示例代码

  1. partial class MainService : ServiceBase
  2. {
  3. public MainService()
  4. {
  5. InitializeComponent();
  6. }
  7.  
  8. protected override void OnStart(string[] args)
  9. {
  10. // TODO: 在此处添加代码以启动服务。
  11. System.IO.File.AppendAllText("D:\\log.txt", "服务已启动……" + DateTime.Now.ToString());
  12. }
  13.  
  14. protected override void OnStop()
  15. {
  16. // TODO: 在此处添加代码以执行停止服务所需的关闭操作。
  17. System.IO.File.AppendAllText("D:\\log.txt", "服务已停止……" + DateTime.Now.ToString());
  18. }
  19. }

然后我们改程序入口Main方法,让其在启动时识别是Windows应用程序还是Windows服务,如果是应用程序就执行应用程序的代码,如果是服务就执行MainService的代码

如果是服务,我给了一个"s"参数,如果有这个参数就证明是Windows服务,然后启动MainService

  1. static void Main(string[] args)
  2. {
  3. //如果传递了"s"参数就启动服务
  4. if (args.Length > && args[] == "s")
  5. {
  6. //启动服务的代码,可以从其它地方拷贝
  7. ServiceBase[] ServicesToRun;
  8. ServicesToRun = new ServiceBase[]
  9. {
  10. new MainService(),
  11. };
  12. ServiceBase.Run(ServicesToRun);
  13. }
  14. else
  15. {}

然后,我们再实现应用程序的功能,就是上面的else语句块,应用程序的功能就是安装/卸载服务,可以用windows自带的sc命令来进行安装和卸载,具体代码如下:

  1. Console.WriteLine("这是Windows应用程序");
  2. Console.WriteLine("请选择,[1]安装服务 [2]卸载服务 [3]退出");
  3. var rs = int.Parse(Console.ReadLine());
  4. switch (rs)
  5. {
  6. case :
  7. //取当前可执行文件路径,加上"s"参数,证明是从windows服务启动该程序
  8. var path = Process.GetCurrentProcess().MainModule.FileName + " s";
  9. Process.Start("sc", "create myserver binpath= \"" + path + "\" displayName= 我的服务 start= auto");
  10. Console.WriteLine("安装成功");
  11. Console.Read();
  12. break;
  13. case :
  14. Process.Start("sc", "delete myserver");
  15. Console.WriteLine("卸载成功");
  16. Console.Read();
  17. break;
  18. case : break;
  19. }

这样我们就实现了一个即是可执行程序又是Windows服务的应用程序

Main方法完整代码如下

  1. static void Main(string[] args)
  2. {
  3. if (args.Length > && args[] == "s")
  4. {
  5. ServiceBase[] ServicesToRun;
  6. ServicesToRun = new ServiceBase[]
  7. {
  8. new MainService(),
  9. };
  10. ServiceBase.Run(ServicesToRun);
  11. }
  12. else
  13. {
  14. Console.WriteLine("这是Windows应用程序");
  15. Console.WriteLine("请选择,[1]安装服务 [2]卸载服务 [3]退出");
  16. var rs = int.Parse(Console.ReadLine());
  17. switch (rs)
  18. {
  19. case :
  20. //取当前可执行文件路径,加上"s"参数,证明是从windows服务启动该程序
  21. var path = Process.GetCurrentProcess().MainModule.FileName + " s";
  22. Process.Start("sc", "create myserver binpath= \"" + path + "\" displayName= 我的服务 start= auto");
  23. Console.WriteLine("安装成功");
  24. Console.Read();
  25. break;
  26. case :
  27. Process.Start("sc", "delete myserver");
  28. Console.WriteLine("卸载成功");
  29. Console.Read();
  30. break;
  31. case : break;
  32. }
  33. }
  34. }

至此,程序已基本写完,接下来我们测试一下

直接双击ServiceOrApp.exe

输入 1

提示安装成功,然后运行“services.msc"打开服务管理器

可以发现我们的服务已安装成功,然后右键启动服务

成功启动

然后去D盘看看log.txt

说明服务执行正常

我们再停止服务

成功停止后再看看D盘的log.txt文件

看到以上内容,说明服务启动和停止都没问题(忘了输出换行符 - -!)

然后我们再试一下卸载服务,还是双击ServiceOrApp.exe,选择2

提示卸载成功,然后再运行“services.msc"打开服务管理器

可以看到已经没有”我的服务“了,已成功卸载

这里安装和卸载主要运用了windows的sc命令,然后使用启动参数来判断是服务还是程序以执行不同的代码

C#创建服务及使用程序自动安装服务,.NET创建一个即是可执行程序又是Windows服务的exe的更多相关文章

  1. [转]C#创建服务及使用程序自动安装服务,.NET创建一个即是可执行程序又是Windows服务的exe

    写在前面 原文地址:C#创建服务及使用程序自动安装服务,.NET创建一个即是可执行程序又是Windows服务的exe 这篇文章躺在我的收藏夹中有很长一段时间了,今天闲着没事,就自己动手实践了一下.感觉 ...

  2. .NET创建一个即是可执行程序又是Windows服务的程序

    不得不说,.NET中安装服务很麻烦,即要创建Service,又要创建ServiceInstall,最后还要弄一堆命令来安装和卸载. 今天给大家提供一种方式,直接使用我们的程序来安装/卸载服务,并且可以 ...

  3. C#创建服务及使用程序自动安装服务

    .NET创建一个即是可执行程序又是Windows服务的exe 不得不说,.NET中安装服务很麻烦,即要创建Service,又要创建ServiceInstall,最后还要弄一堆命令来安装和卸载. 今天给 ...

  4. Topshelf一个用于使用.NET构建Windows服务框架

    1 Topshelf是什么? Topshelf是用于托管使用.NET框架编写的Windows服务的框架.服务的创建得到简化,从而使开发人员可以创建一个简单的控制台应用程序,可以使用Topshelf将其 ...

  5. 可以自动安装mysql数据库的一个shell脚本

    发布:thatboy   来源:脚本学堂     [大 中 小] 分享一例shell脚本,可以实现mysql数据库的自动安装,脚本写的不错,无论是用来学习,还是生产环境中应用,都是不错的,有需要的朋友 ...

  6. C#程序自动安装数字证书

    using System.Security.Cryptography.X509Certificates; MessageBox.Show("开始"); //添加个人证书 X509C ...

  7. Quartz.Net在windows服务中的使用

    写在前面 这几天在弄一个项目,需要定时抓取一些数据,当时也想直接用timer算了.因为之前也弄过这样的项目,但是一想,已经用过了,再去使用同一种思路,未免太乏味了.就换了一种新玩法.这里将之前看到的一 ...

  8. 定时执行exe、windows任务计划、windows服务

    环境: Windows10 + VS2015 + SQL Server2014 + .NET Framework4.5 + C# + WCF 问题: 业务功能需要,做了一个windows应用程序供主程 ...

  9. c#创建、安装、卸载、调试windows服务的简单事例

    最近工作中用到了windows服务,对其有深刻理解和丰富经验谈不上,本篇文章只是简单陈诉用c#创建.安装.卸载.调试windows服务的步骤. 一.创建windows服务 1.用VS创建windows ...

随机推荐

  1. android studio logcat 换行(日志换行)

    起因 今天突然要调试网络数据,调试一大截那个xml数据. 解决思路 一开始去setting哪里看一下logcat 是否有line break,类似的字眼,可惜没有. 我猜如果没有在设置的话,估计就在“ ...

  2. 【转】APP被苹果App Store拒绝的N个原因(持续补充)

    作为iOS开发者,估计有很多都遇到过APP提交到App Store被拒,然后这些被拒的原因多种多样,今天dApps收集了常见的被拒的原因,以便更多开发者了解. 1.程序有重大bug,程序不能启动,或者 ...

  3. timer.scheduleAtFixedRate和timer.schedule的实验

    基础代码: Calendar  currentTime = Calendar.getInstance(); currentTime.setTime(new Date()); int  currentH ...

  4. C# Use Pop3Client to read gmail

    host = "pop.gmail.com" user = "xxxxx@gmail.com" password = "xxxx" port ...

  5. [初读笔记] Cloud Migration Research: A Systematic Review (TCC, 2013)

    Pooyan Jamshidi, Aakash Ahmad, Claus Pahl, "Cloud Migration Research: A Systematic Review," ...

  6. UDP网络通信OSC 协议

    使用方法 ofxOscMessage mesg; mesg.setAddress("m"); mesg.addIntArg(); mesg.addIntArg(); mesg.ad ...

  7. Untracked files不想add

    $ git status On branch feature/20160420_complain_630222 Untracked files: (use "git add <file ...

  8. ZooKeeper与Curator注册和监控

    Curator提供了对zookeeper客户端的封装,并监控连接状态和会话session,特别是会话session过期后,curator能够重新连接zookeeper,并且创建一个新的session. ...

  9. 墓地雕塑-LA3708

    https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=20& ...

  10. POJ 1012 Joseph

    Joseph Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 44650   Accepted: 16837 Descript ...