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。

  • 相关阅读:
    METHODS OF AND APPARATUS FOR USING TEXTURES IN GRAPHICS PROCESSING SYSTEMS
    Display controller
    Graphics processing architecture employing a unified shader
    Graphics-Processing Architecture Based on Approximate Rendering
    Architectures for concurrent graphics processing operations
    Procedural graphics architectures and techniques
    DYNAMIC CONTEXT SWITCHING BETWEEN ARCHITECTURALLY DISTINCT GRAPHICS PROCESSORS
    Thermal zone monitoring in an electronic device
    System and method for dynamically adjusting to CPU performance changes
    Framework for Graphics Animation and Compositing Operations
  • 原文地址:https://www.cnblogs.com/zhangs1986/p/3502026.html
Copyright © 2011-2022 走看看