C#创建Window服务

来源:互联网 发布:nginx 单ip 多域名 编辑:程序博客网 时间:2024/06/06 00:40
    using System;      using System.Threading;      using System.ServiceProcess;      using System.Collections;      using System.Configuration.Install;      using System.Diagnostics;      using System.Collections.Generic;      using System.ComponentModel;      using System.Data;      using System.Drawing;      using System.Text;      using System.Windows.Forms;      using System.Collections.Specialized;      using System.IO;      namespace WSGPSServices      {          public partial class myService : ServiceBase          {              #region 成员变量              public string strCurrPath = new System.IO.FileInfo(System.Reflection.Assembly.GetExecutingAssembly().Location).Directory.FullName;              public string servicesname = "WSGPSServices";//服务              public string Proceename = "WSGPSGateway.exe";// 进程              #endregion              protected override void Dispose(bool disposeing)              {                  if (disposeing)                  {                      if (components != null)                      {                          components.Dispose();                      }                     Register(servicesname, strCurrPath);                  }              }              #region 注册卸载服务              //注册服务              public void Register(string servicesname, string strServiceInstallPath)              {                  IDictionary mySavedState = new Hashtable();                  try                  {                      System.ServiceProcess.ServiceController service = new System.ServiceProcess.ServiceController(servicesname);                      //服务已经存在则卸载                        if (ServiceIsExisted(servicesname))                      {                          UnInstallService(servicesname, strCurrPath);                      }                      service.Refresh();                      //注册服务                        AssemblyInstaller myAssemblyInstaller = new AssemblyInstaller();                      mySavedState.Clear();                      myAssemblyInstaller.Path = "WSGPSServices.exe";                      myAssemblyInstaller.UseNewContext = true;                      myAssemblyInstaller.Install(mySavedState);                      myAssemblyInstaller.Commit(mySavedState);                      myAssemblyInstaller.Dispose();                      service.Start();                      ProcessStartInfo startinfo = new ProcessStartInfo("WSGPSGateway.exe");                      startinfo.WindowStyle = ProcessWindowStyle.Hidden;                      startinfo.Arguments = Application.StartupPath + "\\WSGPSGateway.exe";                      Process.Start(startinfo);                      InitializeComponent();                  }                  catch (Exception ex)                  {                      throw new Exception("注册服务时出错:" + ex.Message);                  }              }              //卸载服务              public void UnInstallService(string strServiceName, string strServiceInstallPath)              {                  try                  {                      if (ServiceIsExisted(servicesname))                      {                          AssemblyInstaller myAssemblyInstaller = new AssemblyInstaller();                          myAssemblyInstaller.UseNewContext = true;                          myAssemblyInstaller.Path = "WSGPSServices.exe";                          myAssemblyInstaller.Uninstall(null);                          myAssemblyInstaller.Dispose();                          KillProcess();                      }                  }                  catch (Exception ex)                  {                      throw new Exception("卸载服务时出错:" + ex.Message);                  }              }              //卸载服务时结束进程              private void KillProcess()              {                  System.Diagnostics.Process myproc = new System.Diagnostics.Process();//得到所有打开的进程                       try                  {                      foreach (Process thisproc in Process.GetProcessesByName(Proceename))                      {                          if (!thisproc.CloseMainWindow())                          {                              thisproc.Kill();                          }                      }                  }                  catch (Exception Exc)                  {                      throw Exc;                  }              }              #endregion              #region 启动服务与应用程序              //启动服务(启动存在的服务,30秒后启动失败报错)                public void StartService(string serviceName)              {                  if (ServiceIsExisted(servicesname))                  {                      System.ServiceProcess.ServiceController service = new System.ServiceProcess.ServiceController("WSGPSServices");                      if (service.Status != System.ServiceProcess.ServiceControllerStatus.Running && service.Status != System.ServiceProcess.ServiceControllerStatus.StartPending)                      {                          service.Start();                          for (int i = 0; i < 30; i++)                          {                              service.Refresh();                              System.Threading.Thread.Sleep(1000);                              if (service.Status == System.ServiceProcess.ServiceControllerStatus.Running)                              {                                  ProcessStartInfo startinfo = new ProcessStartInfo("WSGPSGateway.exe");                                  startinfo.WindowStyle = ProcessWindowStyle.Hidden;                                  startinfo.Arguments = Application.StartupPath + "\\WSGPSGateway.exe";                                  Process.Start(startinfo);                                  break;                              }                              if (i == 29)                              {                                  throw new Exception("服务WSGPS Services启动失败!");                              }                          }                      }                  }              }              //判断服务是否存在                public bool ServiceIsExisted(string serviceName)              {                  ServiceController[] services = ServiceController.GetServices();                  foreach (ServiceController s in services)                  {                      if (s.ServiceName == servicesname)                      {                          return true;                      }                  }                  return false;              }              #endregion              #region Timer定时任务与构造方法              //Timer构造方法              private void InitializeComponent()              {                  this.components = new System.ComponentModel.Container();                  this.Timers = new System.Windows.Forms.Timer(this.components);                  this.Timers.Enabled = true;                  this.Timers.Interval = 180000;                  this.Timers.Tick += new System.EventHandler(this.Timers_Tick);              }              //Timer定时检查任务              private void Timers_Tick(object sender, EventArgs e)              {                  ServiceController[] services = ServiceController.GetServices();                  foreach (ServiceController s in services)                  {                      if (s.ServiceName == servicesname)                      {                          return;//存在返回空                      }                      else                      {                          Register(servicesname, strCurrPath);//无当前服务则重新注册服务                      }                  }              }              #endregion          }      }  


原创粉丝点击