Windows服务的配置与安装

因为当前项目需要使用到一个数据中间件,考虑到服务的稳定性与安全性便采用了Windows服务的方式寄宿推送服务。

创建windows服务首先需要新建一个Windows服务控件,位于常规>Windows服务中


修改完名称后单击添加windows服务,打开创建的windows服务控件代码层,我们可以看到如下原始代码:

partial class QuoteService : ServiceBase
{
        public QuoteService()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
        }

        protected override void OnStop()
        {
            
        }
}
windows服务控件创建后默认为我们重写了两个方法,一个为OnStart一个为OnStop,对应的即为我们的services.msc列表里面的启动与停止事件,我们接下来就可以将需要寄宿服务的启动和停止方法填入这两个事件里面,列如:

partial class QuoteService : ServiceBase
{
        private ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
        private QuoteSocket quote;
        public QuoteService()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            InitialService();

            quote = new QuoteSocket();
            quote.BindQuote("127.0.0.1", 5555);
            quote.Start(6666);
        }

        protected override void OnStop()
        {
            quote.Stop();
        }

        private void InitialService()
        {
            log4net.Config.XmlConfigurator.Configure(new FileInfo(Environment.CurrentDirectory + @"\Config\log4net.xml"));
            log.Info("报价中间件启动");
        }
}
修改完Windows服务控件中的代码绑定后,我们接下来就需要添加安装程序,我们单击我们之前添加的windows服务类,右击【设计】页面,找到【添加安装程序】然后会自动为我们生成ProjectInstaller.cs的安装配置信息,首先点开serviceProcessInstaller1>属性页面修改account(账户)为LocalSystem,然后点开serviceInstaller1修改Description(描述)为自定义服务描述信息,列如XXX公司服务,修改完成后保存。

完成上面两个步骤就基本完成了一个Windows服务的配置工作,接下来我们需要使用ManagedInstallerClass安装组件将服务安装到系统服务列表中,这里贴出一个通用的安装与卸载的公共类:

public static class SelfInstaller
{
        private static readonly string _exePath = Assembly.GetExecutingAssembly().Location;

        public static bool InstallMe()
        {
            try
            {
                ManagedInstallerClass.InstallHelper(new string[] { _exePath });
            }
            catch
            {
                return false;
            }
            return true;
        }

        public static bool UninstallMe()
        {
            try
            {
                ManagedInstallerClass.InstallHelper(new string[] { "/u", _exePath });
            }
            catch
            {
                return false;
            }
            return true;
        }
}

因为windows服务的启动方式和普通的窗体,控制台不同,所以我们需要在项目的Program类中进行判断当前启动的方式否则安装的服务将无法启动,首先判断启动类型是否为windows服务,如果是,则调用服务的方式运行自身的代码块,代码如下:

            if ((!Platform.IsMono && !Environment.UserInteractive)//Windows Service
                || (Platform.IsMono && !AppDomain.CurrentDomain.FriendlyName.Equals(Path.GetFileName(Assembly.GetEntryAssembly().CodeBase))))//MonoService
            {
                RunAsService();
                return;
            }


        static void RunAsService()
        {
            ServiceBase[] servicesToRun;

            servicesToRun = new ServiceBase[] { new QuoteService() };

            ServiceBase.Run(servicesToRun);
        }


上述代码中的QuteService即为我们之前新建的Windows服务的名称,完成以上全部配置后,我们就可以在需要的地方调用SelfInstaller.InstallMe();进行安装,或者调用SelfInstaller.UninstallMe();卸载



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值