.Net实现Windows服务安装完成后自动启动的两种方法

考虑到部署方便,我们一般都会将C#写的Windows服务制作成安装包。在服务安装完成以后,第一次还需要手动启动服务,这样非常不方便。

方法一:在安装完成事件里面调用命令行的方式启动服务

此操作之前要先设置下两个控件 设置serviceProcessInstaller1控件的Account属性为“LocalSystem” 设置serviceInstaller1控件的StartType属性为"Automatic"

在服务器上添加安装程序,在private void ProjectInstaller_AfterInstall(object sender, InstallEventArgs e)事件中,添加以下代码:

/// <summary> 
 /// 安装后自动启动服务 
 /// </summary> 
 /// <param name="sender"></param> 
 /// <param name="e"></param> 
 private void ProjectInstaller_AfterInstall(object sender, InstallEventArgs e)  
    {  
        Process p = new Process  
        {  
            StartInfo =  
            {  
                FileName = "cmd.exe",  
                UseShellExecute = false,  
                RedirectStandardInput = true,  
                RedirectStandardOutput = true,  
                RedirectStandardError = true,  
                CreateNoWindow = true 
            }  
        };  
        p.Start();  
 const string cmdString = "sc start 银医通服务平台1.0"; //cmd命令,银医通服务平台1.0为服务的名称 
        p.StandardInput.WriteLine(cmdString);  
        p.StandardInput.WriteLine("exit");  
    }  

查阅了网上的一些资料,这种方式虽可行,但觉得不够完美。好了,下面来看看如何更好地做到服务自动启动。

方法二:使用ServiceController对象

1.重写ProjectInstaller的Commit方法

using System;  
using System.Collections;  
using System.Collections.Generic;  
using System.ComponentModel;  
using System.Configuration.Install;  
using System.Linq;  
using System.ServiceProcess;  
namespace CleanExpiredSessionSeivice  
{  
    [RunInstaller(true)]  
 public partial class ProjectInstaller : System.Configuration.Install.Installer  
    {  
 public ProjectInstaller()  
        {  
            InitializeComponent();  
        }  
 
 public override void Commit(IDictionary savedState)  
        {  
 base.Commit(savedState);  
            ServiceController sc = new ServiceController("银医通服务平台1.0");  
 if(sc.Status.Equals(ServiceControllerStatus.Stopped))  
            {  
                sc.Start();  
            }  
        }  
    }  
}  

2、在服务安装项目中添加名为 Commit的 Custome Action

在服务安装项目上右击,在弹出的菜单中选择View — Custom Actions

然后在Commit项上右击,选择Add Custom Action…,在弹出的列表框中选择Application Folder。最终结果如下:

需要注意的是,第二步操作是必不可少的,否则服务无法自动启动。我的个人理解是Commit Custom Action 会自动调用ProjectInstaller的Commit方法,Commit Custom Action 在这里扮演了一个调用者的角色。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏张善友的专栏

Windows 2008 R2 Server Core .NET环境配置

.NET Framework的部分功能在2008 R2 Server Core得到支持,包括:.NET 2/3/3.5的子集和ASP.NET。另外,PowerS...

1886
来自专栏xiaoheike

elasticsearch 索引 red 状态恢复 green

index 有一个主节点 0 和一个副本 0 处于 UNASSIGNED 状态,也就是没有分配到机子上,因为主节点没有分配到机子上,所以状态为 red。 从 ...

731
来自专栏Laoqi's Linux运维专列

Mongodb 副本集安装配置

1068
来自专栏杨建荣的学习笔记

Oracle 12cR2初体验(r11笔记第91天)

对于很多Oracle DBA来说,12c最期待人心的就是12c Release 2的发布了,而Linux64位版本的发布则是一个重头戏。详情可以关注公众号dba...

3035
来自专栏bboysoul

使用本地的docker客户端连接远程docker的守护进程

在这之前我们要知道docker是一个c/s架构的程序,也就是说我们输入的docker命令实际上是客户端用来发送指令给docker的守护进程的,所有的操作都是do...

602
来自专栏运维

使用ELK分析腾讯云CLB日志

最近在使用腾讯云,想对访问日志进行收集与分析,发现CLB(负责均衡)日志只能保存到COS上面,而且是每个CLB没小时压发送个gz压缩包到COS。

674
来自专栏大大的微笑

深入理解JVM原理之编译openjdk7

Java虚拟机种类很多例如:HotSpot 丶 JRockit 丶 J9等 我们一般用的就是HotSpot,如果我们电脑上装了JDK,可以运行java -ver...

2459
来自专栏PHP技术

web基础(回顾)

<?php //chr() 函数从指定的 ASCII 值返回字符。 for($i=32;$i<127;$i++){ echo chr($i); } /...

2636
来自专栏杨建荣的学习笔记

dg broker配置的问题及分析 (r7笔记第22天)

今天在配置一个备库的时候碰到了一些问题,话说配置dg broker真没什么特别需要注意的细节了,本身已经给DBA省了很大的事儿了。 但是有时候就是会出现一些稀奇...

3404
来自专栏用户2442861的专栏

TCP socket心跳包示例程序

http://blog.csdn.net/lisonglisonglisong/article/details/51327695#comments

852

扫码关注云+社区