zoukankan      html  css  js  c++  java
  • Visual Studio 2012的Windows Service服务安装方式

    windows服务应用程序是一种长期运行在操作系统后台的程序,它对于服务器环境特别适合,它没有用户界面,不会产生任何可视输出,任何用户输出都回被写进windows事件日志。计算机启动时,服务会自动开始运行,他们不要用户一定登陆才运行。

    可以通过选择菜单“开始”-〉“控制面板”-〉“系统和安全”-〉”管理工具“ -〉“服务”来查看现有系统中的服务,如下图:

    image

    创建window 服务

    新建一个window 服务项目MyService,如下图

    image

    从工具箱的组件表中拖动一个Timer对象到这个视图设计器上面。

    设置Timer属性,Enable为true,Interval属性为3000毫秒

    双击Timer事件,添加事件

    后台代码
       public partial class Service1 : ServiceBase
        {
            public Service1()
            {
                InitializeComponent();
            }
    
            protected override void OnStart(string[] args)
            {
                // TODO: 在此处添加代码以启动服务。
             }
    
            protected override void OnStop()
            {
                // TODO: 在此处添加代码以执行停止服务所需的关闭操作。
             }
    
            private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
            {
    
            }
        }

    public partial class Service1 : ServiceBase
        {
            public Service1()
            {
                InitializeComponent();
            }
            protected override void OnStart(string[] args)
            {
                // TODO: 在此处添加代码以启动服务。
                string state = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "启动";
                WriteLog(state);
            }
            protected override void OnStop()
            {
                // TODO: 在此处添加代码以执行停止服务所需的关闭操作。
                string state = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "停止";
                WriteLog(state);
            }
            private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
            {
                WriteLog(DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"));
            }
            public void WriteLog(string str)
            {
                using (StreamWriter sw = File.AppendText(@"c:service.txt"))
                {
                    sw.WriteLine(str);
                    sw.Flush();
                } 
            }
        }

    其中OnStart和OnStop分别是服务器启动和停止后,所发生的事件操作方法,WriteLog是操作方法;

    将服务程序service1.cs 切换到视图模式,用鼠标右键单击设计视图选择“添加安装程序”选项,此后在项目中自动增加了一个ProjectInstaller.cs

    设置serviceInstaller1组件属性,

    ServiceName=MyServiceLog安装服务器名字;

    StartType=Automatic 开机自动启动

    设计serviceProcessInstaller1的属性Account=LocalSystem;

    运行编译,一个简单的windows服务已经开发完成

    注:如果在代码中的文件路径写成如下“service.txt”,那么此时文件保存在C:WINDOWSsystem32文件夹中。

    安装window服务

    安装命令:InstallUtil.exe MyServiceLog.exe

    InstallUtil存在路径为:C:WINDOWSMicrosoft.NETFramework.NET版本号

    复制C:WINDOWSMicrosoft.NETFramework版本号 路径中的InstallUtil.exe 到bin/debug或bin/release文件夹中,在命令行窗口中直接运行命令

    InstallUtil.exe MyServiceLog.exe,在系统中注册这个服务,使它建立一个合适的注册项,如下图:

    然后再window服务列表中,启动MyServiceLog服务

    卸载window 服务

    命令:InstallUtil.exe MyServiceLog.exe /u

    如果修改这个服务,但是路径没有变化的话是不需要重新注册服务的,直接停止服务,然后用新的文件覆盖原来的文件即可,如果路径发生变化,应该先卸载这个服务,然后重新安装这个服务。

    Window服务应用程序体系结构

    .net framework对windows服务提供了更多的支持,在命名空间System.ServiceProcess下.

    包括类如下:

    ServiceBase 所有Window服务的基类

    ServiceController 该类的一个实例代表一个具体的windows服务

    ServiceControllerPermission 用于控制ServiceController的使用权限

    ServiceInstaller 用于执行对windows服务的安装

    ServiceProcessInstaller 用于执行对windows服务的安装,与上类的不同的是,该类可以代表一个可以执行的windows服务的进程.

    ServiceBase类

    当在服务应用程序中定义服务类时从 ServiceBase 派生。任何有用的服务均将重写 OnStartOnStop 方法。对于其他功能,可以用特定行为重写 OnPauseOnContinue 来响应服务状态的更改。

    服务是长时间运行的可执行文件,它不支持用户界面,在登录的用户帐户下可能无法运行。服务可以在没有任何用户登录计算机的情况下运行。

    默认情况下,服务在“系统”帐户下运行,该帐户与“管理员”帐户不同。不能更改“系统”帐户的权限。或者,可以使用 ServiceProcessInstaller 指定运行服务时将使用的用户帐户。

    一个可执行文件可以包含多项服务,但对每项服务均必须包含一个单独的 ServiceInstallerServiceInstaller 实例在系统中注册服务。安装程序还将每项服务与一个事件日志关联,您可以使用该日志记录服务命令。可执行文件中的 main() 函数定义哪些服务应该运行。服务的当前工作目录是系统目录,而不是可执行文件所位于的目录。

    当启动某项服务时,系统将定位相应的可执行文件,并运行该服务的 OnStart 方法(它包含在可执行文件内)。但是,运行服务与运行可执行文件并不相同。可执行文件仅加载服务。服务则通过“服务控制管理器”访问(例如启动和停止)。

    当您对服务首次调用“开始”时,可执行文件调用 ServiceBase 派生类的构造函数。在构造函数执行之后将立即调用 OnStart 命令处理方法。在服务首次加载之后,构造函数不会再次执行,因此有必要将构造函数执行的处理和 OnStart 执行的处理分开。可以由 OnStop 释放的任何资源都应在 OnStart 中创建。如果服务在 OnStop 释放资源后再次启动,那么,在构造函数中创建资源会妨碍这些资源的正确创建。

    “服务控制管理器”(SCM) 提供与服务交互的方式。可以使用 SCM 将“开始”(Start)、“停止”(Stop)、“暂停”(Pause)、“继续”(Continue) 或自定义命令传递到服务中。SCM 使用 CanStopCanPauseAndContinue 的值,决定服务是否接受“停止”、“暂停”或“继续”命令。仅当服务类中相应的属性 CanStopCanPauseAndContinuetrue 时,才会在 SCM 的上下文菜单中启用“停止”、“暂停”或“继续”。如果已启用,则相应的命令将传递到服务,并且调用 OnStopOnPauseOnContinue。如果 CanStopCanShutdownCanPauseAndContinuefalse,则即使已实现相应的命令处理方法(如 OnStop),也不会予以处理。

    可以使用 ServiceController 类通过编程实现 SCM 使用用户界面实现的功能。可以自动处理控制台中可用的任务。如果 CanStopCanShutdownCanPauseAndContinuetrue,但尚未实现相应的命令处理方法(如 OnStop),则系统引发异常并忽略该命令。

    不必在 ServiceBase 中实现 OnStartOnStop 或其他任何方法。然而,服务的行为在 OnStart 中加以描述,因此至少应重写该成员。必须在可执行文件的 main() 函数中设置服务的服务名称。在 main() 中设置的服务名称必须与服务安装程序的 ServiceName 属性完全匹配。

    可以使用 InstallUtil.exe 在系统中安装服务。

    可以参考文献:http://msdn.microsoft.com/zh-cn/library/system.serviceprocess.servicebase(VS.80).aspx

  • 相关阅读:
    【深度学习系列1】 深度学习在腾讯的平台化和应用实践
    js复制button在ie下的解决方式
    兔子--Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK
    UART串口协议基础1
    高校站点群建设方案简单介绍
    oracle10G之前介质下载地址【珍藏版】
    程序猿打新总结 6月份 新股申购秘籍
    斯坦福IOS开发第五课(第一部分)
    O2O领域添新军,正品网加快布局的战略考量
    如风一样,飞翔------Day37
  • 原文地址:https://www.cnblogs.com/hornet/p/4059437.html
Copyright © 2011-2022 走看看