zoukankan      html  css  js  c++  java
  • VS 2010一步步开发windows服务(windows service)

     基于0起步来创建一个服务,做到简单的记录时间日志功能,其具体招行方法可自行添加。

    1.创建服务

    2.删除默认服务文件

    3.添加自己的服务文件

    4.更改启动项目

    5. 引用 using System.Timers;并添加FileClass类

    FileClass类

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO;
    
    namespace TerminalTrance
    {
        public class FileClass
        {
            //创建文件夹
            //参数:path 文件夹路径
            public bool CreateFolder(string path)
            {
                try
                {
                    if (Directory.Exists(path))
                    {
                        return true;
                    }
                    if (!Directory.Exists(path.Substring(0, path.LastIndexOf("\"))))
                    { //若路径中无“”则表示路径错误
                        return false;
                    }
                    else
                    {
                        //创建文件夹
                        DirectoryInfo dirInfo = Directory.CreateDirectory(path);
                        return true;
                    }
                }
                catch (Exception ex)
                {
                    return false;
                }
            }
    
            //创建文件
            //参数:path 文件路径
            public void CreateFile(string path)
            {
                try
                {
                    if (CreateFolder(path.Substring(0, path.LastIndexOf("\"))))
                    {
                        if (!File.Exists(path))
                        {
                            FileStream fs = File.Create(path);
                            fs.Close();
                        }
                    }
                }
                catch (Exception ex)
                {
                    return;
                }
    
            }
    
            //删除文件
            //参数:path 文件夹路径
            public void DeleteFile(string path)
            {
                try
                {
                    if (!File.Exists(path))
                    {
                        return;
                    }
                    else
                    {
                        File.Delete(path);
                    }
    
                }
                catch (Exception ex)
                {
                    return;
                }
            }
    
            //写文件
            //参数:path 文件夹路径 、content要写的内容
            public void WriteFile(string path, string content)
            {
                try
                {
                    if (!File.Exists(path))
                    {
                        CreateFile(path);
                    }
                    FileStream fs = new FileStream(path, FileMode.Append, FileAccess.Write);
                    StreamWriter sw = new StreamWriter(fs);
                    sw.WriteLine(content);
                    sw.Close();
                }
                catch (Exception ex)
                {
                    return;
                }
            }
    
            /// <summary>
            /// 将即时日志保存入日志文件
            /// </summary>
            public void WriteLogFile(string directoryPath, string content)
            {
                if (!Directory.Exists(directoryPath))
                {
                    CreateFolder(directoryPath);
                }
                try
                {
                    //写入新的文件
                    string filePath = directoryPath + "\" + DateTime.Now.Date.ToString("yyyyMMdd") + ".log";
                    FileStream fs = new FileStream(filePath, FileMode.Append, FileAccess.Write);
                    StreamWriter sw = new StreamWriter(fs);
                    sw.WriteLine(content);
                    sw.Close();
                    fs.Close();
                }
                catch (Exception ex)
                {
    
                }
    
            }
        }
    
    }

    6. 添加上步中需要的InitService()方法

    /// <summary>
            /// 初始化服务参数
            /// </summary>
            private void InitService()
            {
                base.CanShutdown = true;
                base.CanStop = true;
                base.CanPauseAndContinue = true;
                this.ServiceName = MainService.serviceName;
                this.AutoLog = false;//为了使用自定义日志,必须将 AutoLog 设置为 false
    
                tim = new System.Timers.Timer();
                tim.Elapsed += new ElapsedEventHandler(tim_Elapsed);
                tim.Interval = 5000;
                tim.AutoReset = true;
            }

    7. 解决System不包含windows属性问题,引用程序集。

    8.添加上面引用 的 tim_Elapsed 定时方法

     private void tim_Elapsed(object sender, EventArgs e)
            {
                StartThread();
            }
    
            /// <summary>  
            /// 开始任务 
            /// </summary>  
            private void StartThread()
            {
                MessageAdd(serviceName + " " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
            }
    
            /// <summary>  
            ///  日志记录
            /// </summary>  
            /// <param name="serviceName">内容</param>  
            public void MessageAdd(string str)
            {
                try
                {
                    fileclass.WriteLogFile(logPath, str);//写入记录日志
                }
                catch
                {
    
                }
            }

    9.此时生成解决方案是成功的

    10.在OnStart等中写入自己的方法,这里用日志记录

       protected override void OnStart(string[] args)
            {
                try
                {
                    this.tim.Enabled = true;
                    this.tim.Start();
                }
                catch (Exception ex)
                {
                    MessageAdd("OnStart错误:" + ex.Message);
                }
                MessageAdd(serviceName + "已成功启动!");
            }
    
            protected override void OnStop()
            {
                try
                {
                    this.tim.Stop();
                }
                catch (Exception ex)
                {
                    MessageAdd("OnStop错误:" + ex.Message);
                }
                MessageAdd(serviceName + "已停止!");
            }
    
            protected override void OnContinue()
            {
                this.tim.Start();
                base.OnContinue();
            }
    
            protected override void OnPause()
            {
                this.tim.Stop();
                base.OnPause();
            }

    11.给服务添加安装程序。右键鼠标单击MainService.cs[设计]*选项卡选项“添加安装程序”。

    12.可以看见项目中多了如下文件和组件,serviceProcessInstaller1、serviceInstaller1是自动生成的

    13.设置组件serviceInstaller1的主要属性,StartType: AutoMatic自动启动;ServiceName: 服务系统标识,在cmd命令中执行sr start/stop/query等等命令时候使用,用来唯一标识一个Window服务

     

    14.设置组件serviceProcessInstaller1的主要属性,Accout:账户类型,LocalSystem本地系统服务;

    15.设置服务安装后“允许和桌面进行交互”,

    需要在ProjectInstaller.cs中添加如下代码。

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Configuration.Install;
    using System.Linq;
    
    
    namespace TerminalTrance
    {
        [RunInstaller(true)]
        public partial class ProjectInstaller : System.Configuration.Install.Installer
        {
            public ProjectInstaller()
            {
                InitializeComponent();
            }
    
            protected override void OnAfterInstall(IDictionary savedState)
            {
    
                try
                {
    
                    base.OnAfterInstall(savedState);
    
                    // 允许服务桌面交互
    
                    System.Management.ManagementObject myService = new System.Management.ManagementObject(string.Format("Win32_Service.Name='{0}'", this.serviceInstaller1.ServiceName));
    
                    System.Management.ManagementBaseObject changeMethod = myService.GetMethodParameters("Change");
    
                    changeMethod["DesktopInteract"] = true;
    
                    System.Management.ManagementBaseObject OutParam = myService.InvokeMethod("Change", changeMethod, null);
    
                }
    
                catch (Exception ex)
                {
    
                }
    
            }
        }
    }

    16.Windows服务的安装和卸载

    代码写完后,编译通过后,就可以安装、卸载、调试服务了。

    在执行安装或卸载服务前,我有把服务需要的相关文件,复制到C:Service下面或其他路径。一旦安装完成后,此目录不能变更,否则不能卸载该服务和服务运行会报错。

    安装、卸载很简单,只要在VS命令行导航到,服务程序的路径。然后运行以下命令就OK了。

    打开如图:

    安装服务:installutil C:ServiceTerminalTrance.exe

    卸载服务:installutil /u C:ServiceTerminalTrance.exe

    调试的话,只能先安装启动服务,然后将该服务附加到进程,就可以调试了。安装好服务后,就可以在win7服务管理里面,管理刚刚启动的服务了。

     安装成功后可在服务中看到

     在服务程序中可以看到添加的服务

    可以看到程序的日志记录

    另外一个方法是生成安装exe程序

    1.解决方案右键=》新建项目=》选择安装程序

    2.安装项目右键=》添加=》项目输出,选择主项目

    3.安装项目右键=》视图=》自定义操作

    4.自定义操作=》安装右键=》选择主输出

    5.卸载右键=》选择主输出

    6.若有文件需要添加到安装后的文件夹中=》点击应用程序文件夹=》添加=》文件,选择文件。安装后就会生成指定文件。

    7.生成程序,完成,Setup文件夹中找到exe安装文件执行就 OK了。卸载也是执行此exe,按提示下一步就OK。

  • 相关阅读:
    与开发沟通
    LVS、Nginx 及 HAProxy 工作原理
    LVS、Nginx 及 HAProxy 工作原理
    HDU Rabbit and Grass 兔子和草 (Nim博弈)
    HDU 2188 悼念512汶川大地震遇难同胞——选拔志愿者(巴什博弈)
    HDU 2149 Public Sale 拍卖(巴什博弈)
    POJ 3260 The Fewest Coins 最少硬币个数(完全背包+多重背包,混合型)
    POJ Charlie's Change 查理之转换(多重背包,变形)
    UVA 147 Dollars 刀了(完全背包,精度问题)
    POJ Dollar Dayz 美元假日(完全背包,常规+大数)
  • 原文地址:https://www.cnblogs.com/zhangs1986/p/3502026.html
Copyright © 2011-2022 走看看