关于WIndows服务的介绍,之前写过一篇:http://blog.csdn.net/yysyangyangyangshan/article/details/7295739。可能这里对如何写一个服务不是很详细。现在纯用代码的形式介绍一下windows服务是如何开发和安装的。

开发环境:Win7 32位;工具:visualstudio2010。

因为win7自带的就有.net环境,算是偷一下懒吧。因为无论是手动安装或程序安装都要用到。一个目录(默认C盘为操作系统的情况):C:\Windows\Microsoft.NET\Framework,如果你的代码是.net2.0:C:\Windows\Microsoft.NET\Framework\v2.0.50727;4.0:C:\Windows\Microsoft.NET\Framework\v4.0.30319。

下面看一下代码:

一、创建windows服务

如图新建一个Windows服务

进入程序如图

空白服务如下

public partial class Service1 : ServiceBase{System.Threading.Timer recordTimer;public Service1(){InitializeComponent();}protected override void OnStart(string[] args){}protected override void OnStop(){}}

只要在OnStart里完成你的功能代码即可。本例中我们做一个定时向本地文件写记录的功能。

如图

创建一个类,用户写文件,

public class FileOpetation{/// <summary>/// 保存至本地文件/// </summary>/// <param name="ETMID"></param>/// <param name="content"></param>public static void SaveRecord(string content){if (string.IsNullOrEmpty(content)){return;}FileStream fileStream = null;StreamWriter streamWriter = null;try{string path = Path.Combine(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase, string.Format("{0:yyyyMMdd}", DateTime.Now));using (fileStream = new FileStream(path, FileMode.Append, FileAccess.Write)){using (streamWriter = new StreamWriter(fileStream)){streamWriter.Write(content);if (streamWriter != null){streamWriter.Close();}}if (fileStream != null){fileStream.Close();}}}catch { }}}

那么在Service1中调用,

public partial class Service1 : ServiceBase{System.Threading.Timer recordTimer;public Service1(){InitializeComponent();}protected override void OnStart(string[] args){IntialSaveRecord();}protected override void OnStop(){if (recordTimer != null){recordTimer.Dispose();}}private void IntialSaveRecord(){TimerCallback timerCallback = new TimerCallback(CallbackTask);AutoResetEvent autoEvent = new AutoResetEvent(false);recordTimer = new System.Threading.Timer(timerCallback, autoEvent, 10000, 60000 * 10);}private void CallbackTask(Object stateInfo){FileOpetation.SaveRecord(string.Format(@"当前记录时间:{0},状况:程序运行正常!", DateTime.Now));}}

这样服务算是写的差不多了,下面添加一个安装类,用于安装。

如图,在service1上右键-添加安装程序,

如图,添加一个安装程序,

如图,添加完成后,

设置相应的属性,给serviceInstaller1设置属性,主要是描述信息。如图,

给serviceProcessInstaller1设置,主要是account。一般选localsystem,如图,

这样服务已经写好了。那么如何添加到windows服务里面去呢。除了之前说过的用CMD,InstallUtil.exe和服务的exe文件进行手动添加。这些可以用代码来实现的。当然主要过程都是一样的。代码实现也是使用dos命令来完成的。

二、代码安装Windows服务

上面写好的服务,最终生成的是一个exe文件。如图,

安装程序安装时需要用到这个exe的路径,所以方便起见,将这个生成的exe文件拷贝至安装程序的运行目录下。

安装代码,

class Program{static void Main(string[] args){Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);string sysDisk = System.Environment.SystemDirectory.Substring(0,3);string dotNetPath = sysDisk + @"WINDOWS\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe";//因为当前用的是4.0的环境string serviceEXEPath = Application.StartupPath+@"\MyFirstWindowsService.exe";//把服务的exe程序拷贝到了当前运行目录下,所以用此路径string serviceInstallCommand = string.Format(@"{0}  {1}", dotNetPath, serviceEXEPath);//安装服务时使用的dos命令string serviceUninstallCommand = string.Format(@"{0} -U {1}", dotNetPath, serviceEXEPath);//卸载服务时使用的dos命令try{if (File.Exists(dotNetPath)){string[] cmd = new string[] { serviceUninstallCommand };string ss = Cmd(cmd);CloseProcess("cmd.exe");}}catch{}Thread.Sleep(1000);try{if (File.Exists(dotNetPath)){string[] cmd = new string[] { serviceInstallCommand };string ss = Cmd(cmd);CloseProcess("cmd.exe");}}catch{}try{Thread.Sleep(3000);ServiceController sc = new ServiceController("MyFirstWindowsService");if (sc != null && (sc.Status.Equals(ServiceControllerStatus.Stopped)) ||(sc.Status.Equals(ServiceControllerStatus.StopPending))){sc.Start();}sc.Refresh();}catch{}}/// <summary>/// 运行CMD命令/// </summary>/// <param name="cmd">命令</param>/// <returns></returns>public static string Cmd(string[] cmd){Process p = new Process();p.StartInfo.FileName = "cmd.exe";p.StartInfo.UseShellExecute = false;p.StartInfo.RedirectStandardInput = true;p.StartInfo.RedirectStandardOutput = true;p.StartInfo.RedirectStandardError = true;p.StartInfo.CreateNoWindow = true;p.Start();p.StandardInput.AutoFlush = true;for (int i = 0; i < cmd.Length; i++){p.StandardInput.WriteLine(cmd[i].ToString());}p.StandardInput.WriteLine("exit");string strRst = p.StandardOutput.ReadToEnd();p.WaitForExit();p.Close();return strRst;}/// <summary>/// 关闭进程/// </summary>/// <param name="ProcName">进程名称</param>/// <returns></returns>public static bool CloseProcess(string ProcName){bool result = false;System.Collections.ArrayList procList = new System.Collections.ArrayList();string tempName = "";int begpos;int endpos;foreach (System.Diagnostics.Process thisProc in System.Diagnostics.Process.GetProcesses()){tempName = thisProc.ToString();begpos = tempName.IndexOf("(") + 1;endpos = tempName.IndexOf(")");tempName = tempName.Substring(begpos, endpos - begpos);procList.Add(tempName);if (tempName == ProcName){if (!thisProc.CloseMainWindow())thisProc.Kill(); // 当发送关闭窗口命令无效时强行结束进程result = true;}}return result;}}

这段代码其实可以放在项目中的某个地方,或单独执行程序中,只好设置好dotNetPath和serviceEXEPath路径就可以了。

运行完后,如图,

再在安装目录下看记录的文件,

这样,一个windows服务安装成功了。

代码下载:http://download.csdn.net/detail/yysyangyangyangshan/6032671

转载于:https://blog.51cto.com/yangyoushan/1285275

C#创建、安装一个Windows服务相关推荐

  1. 创建一个windows服务的小程序及注意事项

    1,首先在vs中创建一个windows服务项目 会生成一个Service1.cs的文件  打开该文件 切换到代码视图  有两个方法   OnStart(string[] args)和OnStop()方 ...

  2. C# 如何创建一个Windows服务(Windows Service)

    Windows服务经常用来做一些定时任务处理,今天来说一下如何搭建一个Windows服务(基础篇,不喜勿喷). 1.搭建一个Windows Servier,我是VS2017 .NET FrameWor ...

  3. 新建第一个windows服务(Windows Service)

    首先,请原谅我是一个小白,一直到前段时间才在工作需要的情况下写了第一个windows服务.首先说一下为什么写这个windows服务吧,也就是什么需求要我来写这么一个东西.公司的项目中,需要一个预警功能 ...

  4. Mongo数据库安装成Windows服务

    Mongo数据库安装成Windows服务 每次运行mongod --dbpath D:/MongoDB/data命令行来启动MongoDB实在是不方便, 把它作为Windows服务,这样就方便多了. ...

  5. 一键将kafka,zookeeper安装为windows服务

    正式的网站项目,使用了kafka和 zookeeper,原来是通过命令行启动的,存在的风险就是其他人上服务器可能随时或者不小心给你把命令行cmd给关闭掉,这样kafka和zookeeper就挂掉了,那 ...

  6. C# 建一个Windows 服务 定时发邮件

    1.打开VS建一个Windows 服务 2.下一步,填好项目名称和项目保存的地址 3.创建之后,右击.选择添加安装程序 4.添加安装程序之后会出现'serviceInstaller1'=>在此控 ...

  7. Java的jar文件安装成windows 服务

    Java的jar文件安装成windows 服务: 1.下载:nssm,复制到jar文件目录下 2. jar文件目录下创建bat文件[run.bat],内容为[java -jar 文件名.jar] 3. ...

  8. 使用instsrv.exe+srvany.exe将应用程序安装为windows服务

    一.什么是instsrv.exe和srvany.exe instsrv.exe.exe和srvany.exe是Microsoft Windows Resource Kits工具集中 的两个实用工具,这 ...

  9. 写了一个Windows服务,通过C#模拟网站用户登录并爬取BUG列表查询有没有新的BUG,并提醒我...

    写了一个Windows服务,通过C#模拟网站用户登录并爬取BUG列表查询有没有新的BUG,并提醒我 1.HttpUtil工具类,用于模拟用户登录以及爬取网页: using System; using ...

最新文章

  1. jetty java 实例_Maven+Jetty+Servlet 简单示例
  2. springboot 定制个性 banner
  3. jQuery相关方法6----三大系列属性
  4. Android应用程序之间共享文字和图片(一)
  5. 现在要吃软饭的,都这么明目张胆了吗?
  6. android camera 显示过程,Android Camera2 API显示已处理的预览图像
  7. Spring Cloud Alibaba迁移指南(三):极简的 Config 1
  8. (97)FPGA手写RAM(Verilog)
  9. 跳槽了,但是面试官问的总答不到点上……
  10. 支持js代码的博客有哪些?
  11. linux中SUID,SGID和SBIT的奇妙用途
  12. 计算机及格人数函数公式大全,excel函数计算及格人数和合格人数
  13. 从源代码编译和安装gluster
  14. [软件人生]写书与程序员
  15. 盘点Scratch少儿编程的实用性
  16. Windows API一日一练(20)LoadIcon和LoadCursor函数-程序图标设置和鼠标的样式
  17. 尝试进行函数封装--计算BMI值
  18. 计算机网络 谢希仁 第八版 学习笔记
  19. 使用mmdetection训练自己的coco数据集(免费分享自制数据集文件)
  20. Python编写手机App————kivy

热门文章

  1. python下拉菜单_python-web自动化:下拉列表操作
  2. MM32F3277 MicroPython 的定时器功能
  3. 制作测试MM32F3277-MicroPython最小电路板
  4. 第十五届全国大学生智能车竞赛线上竞赛方案(草案)
  5. mysql 设置表的大小_mysql InnoDB建表时设定初始大小的方法
  6. python logging.getlogger_logging.getLogger与logger的父子关系
  7. java远程线程注入_系统权限远程线程注入到Explorer.exe
  8. 语句中如何结束本循环进入下一循环_第33 p,for遍历,循环取值最方便
  9. 网络通信基础:ICMP基础通识
  10. 网络通信基础知识普及篇