zoukankan      html  css  js  c++  java
  • 【C#】C#创建Windows Service服务

    目录结构:

    contents structure [+]

    最近写了一个TCP连接的程序,由于这种通信协议不同于HTTP协议,因此还不能部署到网站上面,于是就用到了Window服务。接下面笔者介绍一下在Visual Studio中如何安装、调试Windows服务。笔者的Visual studio版本为2012,window版本为win7。

    1.创建Windows服务

    这时候点击“启动”按钮,会提示我们启动失败。

    这因为Windows服务不能像普通窗口程序那样启动,接下来就安装服务。

    2.配置

    在Service1.cs上右键,选择“查看设计器”,

    然后再在上面的空白处,右键选择“添加安装程序”,

    这时候,Visual Studio就会自动为我们生成一个ProjectInstaller.cs文件,接下来,右键ProjectInstaller.cs,选择“查看设计器”,就可以看到如下的界面,

    可以看到两个控件,点击右击第一个控件,打开属性设计器,将其中的Account设置为LocalSystem(本地服务),

    接下来,右击上面的第二个控件,打开属性界面,设置ServiceName,和将其中的StratType设置为Automatic,

    接下来,为了测试需要,笔者写一些测试代码:

       public partial class Service1 : ServiceBase
        {
            private readonly Timer _MyTimer;
            public Service1()
            {
                InitializeComponent();
                _MyTimer = new Timer(10*1000); //10秒钟启动一次
                _MyTimer.Elapsed += _MyTimerElapsed;
            }
    
            protected override void OnStart(string[] args)
            {
                _MyTimer.Start();
            }
    
            protected override void OnStop()
            {
                _MyTimer.Stop();
            }
            internal void _MyTimerElapsed(object sender, ElapsedEventArgs e)
            {
                try
                {
                    //添加往C盘新建一个文本文件的程序
                    try
                    {
    
                        string logFileName = @"C:\log.txt"; // 文件路径
    
                        FileInfo fileinfo = new FileInfo(logFileName);
    
                        using (FileStream fs = fileinfo.OpenWrite())
                        {
    
                            StreamWriter sw = new StreamWriter(fs);
    
                            sw.WriteLine("=====================================");
    
                            sw.Write("添加日期为:" + DateTime.Now.ToString() + "
    ");
    
                            sw.WriteLine("=====================================");
    
                            sw.Flush();
    
                            sw.Close();
                        }
    
                    }
    
                    catch (Exception ex)
                    {
    
                        //  ex.ToString();
    
                    }
    
    
                }
                catch (Exception ex)
                { }
            }
        }

    上面的代码,笔者写到Service1.cs类中,该类是Visual Sudio在启动的时候,自动为我们创建好的类文件。观察这个类文件,可以发现,该类继承了ServiceBase,ServiceBase是服务类的基类,也就是说想要创建服务,必需继承这个类,ServiceBase中有两个方法比较常用,分别为OnStart()和OnStop(),顾名思义,OnStart方法在服务启动的时候调用,OnStop方法在服务停止的时候调用。

    在测试代码写好后,我们就可以点击 生成》生成解决方案,如果后需修改了,那么需要点击重新生成解决方案:

    在解决方案生成好后,接下来就是安装Windows服务了。

    3.安装Windows服务

    找到上面项目中 bindebug 目录下生成的exe文件,这里笔者的位置为  D:DevTestday20171218MyWindowsServiceMyWindowsServiceinDebugMyWindowsService.exe 

    在这个文件夹中,我们看见生成了许多文件,这些文件是这个服务的一些配置和数据库信息,.config就是以前的App.config内容,.如果笔者不想在这个Debug文件夹里安装服务,那么最好把整个Debug文件夹复制过去。然后再打开cmd,进入到.net对应版本的目录中,这里笔者的版本为4.0,可以通过查看 C:WindowsMicrosoft.NETFramework ,目录下的版本信息,一般情况下,最高版本为当前版本。

    在CMD中进入到对应的版本中,

    然后通过Installer.exe进行安装,安装的时候,需要指定生成了服务exe文件的位置,比如:

    InstallUtil.exe D:DevTestday20171218MyWindowsServiceMyWindowsServiceinDebugMyWindowsService.exe

    如果想要卸载,只需要在InstallUtil.exe后面加上/u就可以了,比如:

    InstallUtil.exe /u D:DevTestday20171218MyWindowsServiceMyWindowsServiceinDebugMyWindowsService.exe

    服务安装好后,就可以启动服务了。

    按下“Win+R”打开运行界面框,然后输入services.msc,进入到服务界面,找到自己对应的服务,启动。

    在上面的OnStart方法中,我们在C盘下面打印了日志,接下来,打开上面的C盘下面的log.txt,

    可以看到日志已经成功打印了。

    到这里为止,一个Window Server的服务程序,就完成了,接下来,笔者介绍如何在Visual Studio中调试Windows服务程序。

    4.在Visual Studio中调试

    Windows服务的调试和普通程序也不一样,

    首先在代码设置断点,在上面的_MyTimerElapsed方法中添加Debugger.Launch()方法即可。

    这里可以重新生成一下解决方案,然后选择  调试》附加到进程

    如果没有,刷新一下就出来了。

    接下来,重启一下服务,就可以正常调试了。

    5.常见问题

    如果安装windows服务的时候,出现报错securiy Exception,那么应该以管理员的身份启动窗口。

    如果安装Windows服务的时候,出现System.ComponentModel.Win32Exception,那么是因为在Visual Studio中设置serviceProcessInstaller1时候,没有把Account设置为LcoalSystem.

  • 相关阅读:
    nginx实现请求的负载均衡 + keepalived实现nginx的高可用
    nginx的location配置详解
    nginx负载均衡算法
    nginx实现集群高可用
    Nginx:承受3万并发连接数,胜过Apache 10倍
    编程高手与调试高手
    Android 中调试手段 打印函数调用栈信息
    android 中打 Log 的一些技巧
    Java程序员应该知道的10个调试技巧
    Camera中对焦模式总结
  • 原文地址:https://www.cnblogs.com/HDK2016/p/8056977.html
Copyright © 2011-2022 走看看