.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 条评论
登录 后参与评论

相关文章

来自专栏SceneKit

OpenGL ES _ 入门_01

](http://upload-images.jianshu.io/upload_images/1594482-6a9848ca8df11b95.png?im...

632
来自专栏极客编程

用Java为Hyperledger Fabric(超级账本)开发区块链智能合约链代码之部署与运行示例代码

您已经定义并启动了本地区块链网络,而且已构建 Java shim 客户端 JAR 并安装到本地 Maven 存储库中,现在已准备好在之前下载的 Hyperled...

301
来自专栏码农阿宇

ASP.NET Core MVC中构建Web API

在ASP.NET CORE MVC中,Web API是其中一个功能子集,可以直接使用MVC的特性及路由等功能。 在成功构建 ASP.NET CORE MVC项目...

2793
来自专栏逸鹏说道

Mysql 该如何 Entity Framework 数据库迁移 和 如何更好的支持EF.Extended

问题 1.在使用EntityFramework访问Mysql的时候,使用迁移来生成数据库或者更新数据库时候会遇到一些问题 2.EntityFramework.E...

26611
来自专栏小鹏的专栏

在mac上安装Xgboost Python库

最近在mac上用到xgboost库,安装时遇到颇多大坑,网上查了很多答案几乎都是win上的问题,没遇到理想的,自己也就摸着石头把几个大坑给填了,总结一下,给后...

20610
来自专栏GuZhenYin

使用OWIN作为WebAPI的宿主

前言 好吧,也没什么好说的,就是个技术的总结,直接生成MVC的项目,感觉好重,虽然各种东西很全 ...也许我是处女座? - -, OWIN呃,这里我就不解释了,...

1765
来自专栏FreeBuf

九种姿势运行Mimikatz

*本文原创作者:R1ngk3y,本文属FreeBuf原创奖励计划,未经许可禁止转载

943
来自专栏数据和云

循序渐进:Oracle 11.2 RAC集群进程的初始化与启动过程

张大朋(Lunar)Oracle 资深技术专家 Lunar 拥有超过十年的 ORACLE SUPPORT 从业经验,曾经服务于ORACLE ACS部门,现就职...

3638
来自专栏MixLab科技+设计实验室

设计师编程指南之Sketch插件开发 7 GUI

往期文章索引: 1 / 入门基本概念、page的相关操作 2 / artboard 、NSFileManager 和 NSString 关于文件及文件夹的相关操...

3184
来自专栏bboysoul

如何在metasploit中使用shodan

首先打开metasploit sudo service postgresql start msfconsole

883

扫描关注云+社区