C# create Windows Service
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
}
}
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
}
}