安装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);
            }
        }
    }


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("\r\n" + DateTime.Now.ToString() + "服务已启动……", ServerLogUrl);
        }

        protected override void OnStop()
        {
            FileHelper.WriteTxt("\r\n" + DateTime.Now.ToString() + "服务已停止……", ServerLogUrl);
        }

        internal const string ServerLogUrl = "ServerLog.txt";
    }

5.最后在installer打包项目中添加自定义操作:

指定输出:

然后生成打包项目就可以了

原文地址:https://www.cnblogs.com/hepeng/p/9418648.html

时间: 2024-08-21 17:31:30

安装winform程序时自动安装windows服务的相关文章

在打包程序中自动安装SQL Server数据库 .

原文:在打包程序中自动安装SQL Server数据库 . 1.创建安装项目“Setup1”安装项目 在“文件”菜单上指向“添加项目”,然后选择“新建项目”. 在“添加新项目”对话框中,选择“项目类型”窗格中的“安装和部署项目”,然后选择“模板”窗格中的“安装项目”.在“名称”框中键入 “setup1”. 单击“确定”关闭对话框. 项目被添加到解决方案资源管理器中,并且文件系统编辑器打开. 在“属性”窗口中,选择 ProductName 属性,并键入”亿万电器成套报价系统”. 2.在安装项目中创建

使用Inno Setup 打包.NET程序,并自动安装.Net Framework

使用Inno Setup 打包.NET程序,并自动安装.Net Framework http://www.cnblogs.com/xiaogangqq123/archive/2012/03/19/2405730.html Inno Setup是什么 Inno Setup 是一个windows系统下的安装包制作程序.它是免费的(而且允许免费用于商业用途).官网网站:http://www.jrsoftware.org/ 虽然说.NET 可以使用VS来打包安装包,但可定制化绝对不如Inno Setup

CentOS 安装autofs 以建立自动mount的服务

一.安装 yum install autofs 二.配置目录的配置文件map 修改/etc/autofs.master # 标记/var/ftp/pub目录的配置文件为/etc/auto.vsftpd # Sample auto.master file # This is an automounter map and it has the following format # key [ -mount-options-separated-by-comma ] location # For det

EBS运行快速安装的程序时,提示DISPLAY变量设置不对

EBS运行快速安装的程序时,系统提示如下: Rapid Install Wizard is validating your file system...... >> Wizard requires the DISPLAY variable to be set. >> Please set your DISPLAY variable and restart Rapid Install Wizard. 在主机进行以下设置后,尝试重新运行仍旧报错: $ export DISPLAY=IP

Zabbix监控(九):自动监控windows服务

一.监控服务状态的Key: service_state[service] State of service. 0 - running, 1 - paused, 2 - start pending, 3 - pause pending, 4 - continue pending, 5 - stop pending, 6 - stopped, 7 - unknown, 255 - no such service 返回0表示运行,返回6表示关闭,返回7表示未知,返回255表示没有. 二.手动监控客户端

【转】WinDbg调试器:启动程序时自动连接调试器方法

当我们调试服务进程或子进程时,无法直接用调试加载进程的方式启动,此时需要在启动程序时自动连接调试器方法: 第一步:注册表展开到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options路径下: 第二步:在Image File Execution Options上鼠标右键,新建"项",项名为你要调试的程序,比如 test.exe: 第三步:在项名上,右键,新建字符

使用Jenkins自动发布Windows服务项目

不同于发布Web项目,自动发布Windows服务项目需要解决以下几个问题: 如何远程停止和开启服务?需要在发布前停止服务,在发布完成后开启服务. 如何上传编译文件到目标服务器? 问题1:如何远程停止和开启服务 在msbuild之前添加一个execute windows batch command,执行cmd命令,cmd命令如下: echo **********stop remote server windows service********** "C:\Program Files\IIS\Mi

windows系统下,在C#程序中自动安装字体

在Windows系统中,原有自带的字体样式有限,有时候我们的程序会使用到个别稀有或系统不自带的字体.因此我们需要将字体打包到程序中,当程序启动时,检测系统是否有该字体,如果没有则安装该字体,也可以动态加载字体. 1.1.使用代码安装字体 注意:安装字体时,需要windows的管理员权限. [DllImport("kernel32.dll", SetLastError = true)] public static extern int WriteProfileString(string

安装oracle 11g时,报启动服务出现错误,找不到OracleMTSRecoveryService的解决方法

很多人在安装orcl数据库时,出现很多报错,我也不例外,因上次数据库出现问题,无法修复,只能从新安装,无奈的是,安装时报启动服务出现错误,找不到OracleMTSRecoveryService错MMP,心想又是咋咯回事,第一反应肯定就是没卸载干净.下面时处理办法:不是所有报错通用办法. 打开注册表看看:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services下,找到OracleMTSRecoveryService及OracleRemExecServ