一、创建一个Windows Service
1)创建Windows Service项目
2)对Service重命名
将Service1重命名为你服务名称,这里我们命名为ServiceTest。
二、创建服务安装程序
1)添加安装程序
之后我们可以看到上图,自动为我们创建了ProjectInstaller.cs以及2个安装的组件。 也可以用代码创建这些
2)修改安装服务名
右键serviceInsraller1,选择属性,将ServiceName的值改为ServiceTest。
3)修改安装权限
右键serviceProcessInsraller1,选择属性,将Account的值改为LocalSystem。
三、写入服务代码
1)打开ServiceTest代码
右键ServiceTest,选择查看代码。
2)写入Service逻辑
添加如下代码:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Linq; using System.ServiceProcess; using System.Text; namespace WindowsServiceTest { public partial class ServiceTest : ServiceBase { public ServiceTest() { InitializeComponent(); } protected override void OnStart(string[] args) { using (System.IO.StreamWriter sw = new System.IO.StreamWriter("C:\\log.txt", true)) { sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ") + "Start."); } } protected override void OnStop() { using (System.IO.StreamWriter sw = new System.IO.StreamWriter("C:\\log.txt", true)) { sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ") + "Stop."); } } } }
这里我们的逻辑很简单,启动服务的时候写个日志,关闭的时候再写个日志。
四:安装和卸载windows服务
其实不用那么麻烦,
安装:步骤:win+R -----CMD -------输入microsoft的framework的相应版本的执行程序位置(如:C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe 空一格再输入你的服务的执行文件的路径(如:D:\zt_documents\服务\SSY.DealerLoginStateService.root\SSY.DealerLoginStateService\SSY.LoginStateService\SSY.LoginStateService\bin\Debug\XX.exe(这里的.exe写自己的项目的名称)
卸载:步骤:win+R -----CMD -------输入microsoft的framework的相应版本的执行程序位置(如:C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe -u 空一格再输入你的服务的执行文件的路径(如:D:\zt_documents\服务\SSY.DealerLoginStateService.root\SSY.DealerLoginStateService\SSY.LoginStateService\SSY.LoginStateService\bin\Debug\XX.exe(这里的.exe写自己的项目的名称)
如果出现安装有问题,提示权限问题,或者InstallUtil.exe不是有些的win32程序,直接把可以安装目录下面的复杂过去就可以安装了
五:服务定时任务小例子
partial class GetUnitePService : ServiceBase { public GetUnitePService() { InitializeComponent(); } Timer t; protected override void OnStart(string[] args) { t = new Timer(); t.Interval = 5*60 * 1000; t.Elapsed += t_Elapsed; t.Start(); WriteToLog("开始服务"); } void t_Elapsed(object sender, ElapsedEventArgs e) { WriteToLog("开始执行一次获取," + DateTime.Now); } protected override void OnStop() { t.Stop(); WriteToLog("停止服务"); } private void getUnitePrice() { GetPriceSvc.GetPriceSvcClient gpc = new GetPriceSvc.GetPriceSvcClient(); GetPriceSvc.ReturnDataOfArrayOfPriceInfo_DTODhuO2YUv res = gpc.GetPriceInfoByCompany("3ma5c094-7d4c-4f8c-8e8f-3530f18ca8kc", "fygjGetUnitePrice"); WriteToLog("获取完了得到的条数:" + res.Value.Count() + " ," + DateTime.Now); } private void WriteToLog(string str) { try { string strdt = DateTime.Now.ToString("yyyy-MM-dd"); FileStream aFile = new FileStream("D:\\LogGetUnitePrice\\" + strdt + ".txt", FileMode.Append); StreamWriter sw = new StreamWriter(aFile, Encoding.Default); sw.WriteLine(str); sw.Close(); } catch { } } }
六:后台设置服务名称,可以写在配置文件中读取
或者直接在安装的时候从命名即可
[RunInstaller(true)] public partial class ProjectInstaller : System.Configuration.Install.Installer { private System.ServiceProcess.ServiceInstaller serviceInstaller1; private ServiceProcessInstaller processInstaller; public ProjectInstaller() { InitializeComponent(); processInstaller = new ServiceProcessInstaller(); serviceInstaller1 = new System.ServiceProcess.ServiceInstaller(); processInstaller.Account = ServiceAccount.LocalService; serviceInstaller1.StartType = ServiceStartMode.Automatic;//自动启动 serviceInstaller1.ServiceName = "xkAutoAdvert"; serviceInstaller1.Description = "讯酷网广告统计消息队列处理服务"; Installers.Add(serviceInstaller1); Installers.Add(processInstaller); } }