以前写的后台程序都是用控制台的,刚才尝试了一下这个生成服务的程序,很强大,转载过来,大家看看!
- 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";// 进程
- public System.ComponentModel.Container components;
- System.Windows.Forms.Timer Timers;
- #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
- }
- }