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

相关文章

来自专栏落花落雨不落叶

canvas画简单电路图

63411
来自专栏C#

DotNet加密方式解析--非对称加密

    新年新气象,也希望新年可以挣大钱。不管今年年底会不会跟去年一样,满怀抱负却又壮志未酬。(不过没事,我已为各位卜上一卦,卦象显示各位都能挣钱...)...

4928
来自专栏大内老A

The .NET of Tomorrow

Ed Charbeneau(http://developer.telerik.com/featured/the-net-of-tomorrow/) Exciti...

32110
来自专栏pangguoming

Spring Boot集成JasperReports生成PDF文档

由于工作需要,要实现后端根据模板动态填充数据生成PDF文档,通过技术选型,使用Ireport5.6来设计模板,结合JasperReports5.6工具库来调用渲...

1.2K7
来自专栏张善友的专栏

Silverlight + Model-View-ViewModel (MVVM)

     早在2005年,John Gossman写了一篇关于Model-View-ViewModel模式的博文,这种模式被他所在的微软的项目组用来创建Expr...

2988
来自专栏java 成神之路

使用 NIO 实现 echo 服务器

4737
来自专栏跟着阿笨一起玩NET

c#实现打印功能

2822
来自专栏转载gongluck的CSDN博客

cocos2dx 打灰机

#include "GamePlane.h" #include "PlaneSprite.h" #include "BulletNode.h" #include...

5596
来自专栏张善友的专栏

LINQ via C# 系列文章

LINQ via C# Recently I am giving a series of talk on LINQ. the name “LINQ via C...

2665
来自专栏Golang语言社区

【Golang语言社区】GO1.9 map并发安全测试

var m sync.Map //全局 func maintest() { // 第一个 YongHuomap := make(map[st...

4778

扫码关注云+社区