安装winform程序时自动安装windows服务
Posted hepeng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了安装winform程序时自动安装windows服务相关的知识,希望对你有一定的参考价值。
项目中遇到一个需求:安装winform程序时自动安装windows服务,且windows服务运行时反过来检测winform程序是否启动。如果没有则启动。
经过一番查阅已在win10下实现并运行正常。在此记录便于以后查看
实现思路:利用打包插件VS installer 有一个自定义操作,可以指定安装完成后运行的程序集,并在程序集中默认启动一个windows服务安装类
实现步骤:1.在winform程序所在解决方案中,添加一个vs installer打包项目, vs installer的使用不再累述,请百度。。
2. 创建一个类库项目作自定义操作用
3. 这是服务安装帮助类 用于安装或删除服务
public class ServiceHelper { /// <summary> /// 服务是否存在 /// </summary> /// <param name="serviceName"></param> /// <returns></returns> public static bool IsServiceExisted(string serviceName) { ServiceController[] services = ServiceController.GetServices(); foreach (ServiceController s in services) { if (s.ServiceName == serviceName) { return true; } } return false; } /// <summary> /// 启动服务 /// </summary> /// <param name="serviceName"></param> public static void StartService(string serviceName) { if (IsServiceExisted(serviceName)) { ServiceController service = new ServiceController(serviceName); if (service.Status != ServiceControllerStatus.Running && service.Status != ServiceControllerStatus.StartPending) { service.Start(); for (int i = 0; i < 60; i++) { service.Refresh(); System.Threading.Thread.Sleep(1000); if (service.Status == ServiceControllerStatus.Running) { break; } if (i == 59) { throw new Exception("Start Service Error:" + serviceName); } } } } } /// <summary> /// 获取服务状态 /// </summary> /// <param name="serviceName"></param> /// <returns></returns> public static ServiceControllerStatus GetServiceStatus(string serviceName) { ServiceController service = new ServiceController(serviceName); return service.Status; } /// <summary> /// 配置服务 /// </summary> /// <param name="serviceName"></param> /// <param name="install"></param> public static void ConfigService(string serviceName, bool install) { TransactedInstaller ti = new TransactedInstaller(); ti.Installers.Add(new ServiceProcessInstaller { Account = ServiceAccount.LocalSystem, }); ti.Installers.Add(new ServiceInstaller { DisplayName = serviceName, ServiceName = serviceName, Description = "定时启动医掌管服务端", ServicesDependedOn = new string[] { },//前置服务 ServicesDependedOn = new string[] { "MSSQLSERVER" } StartType = ServiceStartMode.Automatic//运行方式 }); ti.Context = new InstallContext(); string strPath = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); ti.Context.Parameters["assemblypath"] = strPath + "\\" + "RestartService.exe"; //Assembly.GetEntryAssembly().Location if (install) { ti.Install(new Hashtable()); } else { ti.Uninstall(null); } } }
View Code
4.添加windows服务的类库
/// 定时任务客户端 /// </summary> public class AutoTaskClient : Registry { public AutoTaskClient() { Schedule<StartupWinfrom>().ToRunNow().AndEvery(1).Minutes(); } public void Start() { JobManager.Initialize(this); } } /// <summary> /// 定时启动winform程序 /// </summary> public class StartupWinfrom : IJob { public void Execute() { Process proc = Process.GetProcessesByName("xxxServer").FirstOrDefault(); if (proc == null) { string path = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\\xxxServer.exe"; CjwdevHelper.StartProcess(path); } } }
public partial class Service1 : ServiceBase { public Service1() { InitializeComponent(); } protected override void OnStart(string[] args) { new AutoTaskClient().Start(); FileHelper.WriteTxt(" " + DateTime.Now.ToString() + "服务已启动……", ServerLogUrl); } protected override void OnStop() { FileHelper.WriteTxt(" " + DateTime.Now.ToString() + "服务已停止……", ServerLogUrl); } internal const string ServerLogUrl = "ServerLog.txt"; }
5.最后在installer打包项目中添加自定义操作:
指定输出:
然后生成打包项目就可以了
以上是关于安装winform程序时自动安装windows服务的主要内容,如果未能解决你的问题,请参考以下文章
C#创建服务及使用程序自动安装服务,.NET创建一个即是可执行程序又是Windows服务的exe
winform_使用ClickOnce生成安装程序包页面&程序发布新版本通知客户端更新