利用vs.net快速开发windows服务(总结)

简介:

在很多应用中需要做windows服务来操作数据库等操作,比如

(1)一些非常慢的数据库操作,不想一次性去做,想慢慢的通过服务定时去做,比如定时为数据库备份等
(2)在.net Remoting中利用windows服务来做Host

利用vs.net我们可以在几分钟之内建立其windows服务,非常简单

下面说一下步骤
1. 新建一个项目
2. 从一个可用的项目模板列表当中选择Windows服务
3. 设计器会以设计模式打开
4. 从工具箱的组件表当中拖动一个Timer对象到这个设计表面上 (注意: 要确保是从组件列表而不是从Windows窗体列表当中使用Timer) 
5. 设置Timer属性,Interval属性200毫秒(1秒进行5次数据库操作)
6. 然后为这个服务填加功能
7.双击这个Timer,然后在里面写一些数据库操作的代码,比如
 SqlConnection conn=new SqlConnection("server=127.0.0.1;database=test;uid=sa;pwd=275280");
   SqlCommand comm=-new SqlCommand("insert into tb1 ('111',11)",conn);
   conn.Open();
   comm.ExecuteNonQuery();
   conn.Close();

8. 将这个服务程序切换到设计视图
9. 右击设计视图选择“添加安装程序”
10. 切换到刚被添加的ProjectInstaller的设计视图
11. 设置serviceInstaller1组件的属性: 
    1) ServiceName = My Sample Service
    2) StartType = Automatic (开机自动运行)
12. 设置serviceProcessInstaller1组件的属性  Account = LocalSystem
13. 改变路径到你项目所在的bin\Debug文件夹位置(如果你以Release模式编译则在bin\Release文件夹)
14. 执行命令“InstallUtil.exe MyWindowsService.exe”注册这个服务,使它建立一个合适的注册项。(InstallUtil这个程序在WINDOWS文件夹\Microsoft.NET\Framework\v1.1.4322下面)
15. 右击桌面上“我的电脑”,选择“管理”就可以打计算机管理控制台
16. 在“服务和应用程序”里面的“服务”部分里,你可以发现你的Windows服务已经包含在服务列表当中了
17. 右击你的服务选择启动就可以启动你的服务了
看看数据库是不是一秒多了5个记录啊

需要注意的是:
如果你修改了这个服务,路径没有变化的话是不需要重新注册服务的,如果路径发生了变化,需要先卸载这个服务InstallUtil.exe /u参数,然后再重新安装这个服务,不能直接安装。还有就是windows服务是没有界面的,不要企图用控制的输出方式来输出一些信息,你只能添加一个EventLog,通过WriteEntry()来写日志。

关于怎么用windows服务来做一个远程服务可以看一下
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetsec/html/SecNetHT15.asp

问题
用以上说的建立了一个服务,启动后,timer却不起作用,sql不执行,不知道为什么?服务都是顺利启动的,但却不执行任务?

可以在 OnStart() 方法里加上 this.timer1.Enabled = true; 
另外看一下this.timer1.Elapsed += new System.Timers.ElapsedEventHandler(this.timer1_Elapsed); 是否和你的事件关联上

如何实现可插拔的windows服务
如果只是实现普通需求非常容易,可以参考文章里的那几个blog。但是如果要做为一个企业级的应用,往往会有别的场景需求。这里描述了能在不改变系统结构的情况下,可以非常快速的支持新的服务要求,并且以多线程方式支持多种业务逻辑的weindows服务开发方法,最后是一些调试技巧。 
文章地址: 
http://www.cnblogs.com/lodestar/archive/2007/04/18/718615.html  

用C#创建Windows服务(Windows Services) 
文章地址: http://caca.cnblogs.com/archive/2005/02/25/109028.aspx

C#安装卸载服务 
引用
 http://blog.csdn.net/lizhizhe2000/archive/2006/09/19/1249209.aspx

这是一个安装和卸载服务的类,有兴趣可以看一下.

using System;
using System.Runtime.InteropServices;
namespace EAE.MyServiceInstaller
{
  class ServiceInstaller
 {
   #region Private Variables
   private  string _servicePath;
   private  string _serviceName;
   private  string _serviceDisplayName;
   #endregion Private Variables
   #region DLLImport
  [DllImport("advapi32.dll")]
   public  static  extern IntPtr OpenSCManager( string lpMachineName, string lpSCDB,  int scParameter);
  [DllImport("Advapi32.dll")]
   public  static  extern IntPtr CreateService(IntPtr SC_HANDLE, string lpSvcName, string lpDisplayName, 
    int dwDesiredAccess, int dwServiceType, int dwStartType, int dwErrorControl, string lpPathName, 
    string lpLoadOrderGroup, int lpdwTagId, string lpDependencies, string lpServiceStartName, string lpPassword);
  [DllImport("advapi32.dll")]
   public  static  extern  void CloseServiceHandle(IntPtr SCHANDLE);
  [DllImport("advapi32.dll")]
   public  static  extern  int StartService(IntPtr SVHANDLE, int dwNumServiceArgs, string lpServiceArgVectors);
  [DllImport("advapi32.dll",SetLastError= true)]
   public  static  extern IntPtr OpenService(IntPtr SCHANDLE, string lpSvcName, int dwNumServiceArgs);
  [DllImport("advapi32.dll")]
   public  static  extern  int DeleteService(IntPtr SVHANDLE);
  [DllImport("kernel32.dll")]
   public  static  extern  int GetLastError();
   #endregion DLLImport
//    //
//    // / 应用程序入口.
//    //
//
//   [STAThread]
//   static void Main(string[] args)
//   {
//
//    string svcPath;
//    string svcName;
//    string svcDispName;
//     // 服务程序的路径
//    svcPath = @"d:\service\EAEWS.exe";
//    svcDispName="myEAEWS";
//    svcName= "myEAEWS";
//    ServiceInstaller c = new ServiceInstaller();
//    c.InstallService(svcPath, svcName, svcDispName);
//    Console.Read();
//
//   }

   ///  
  
///  安装和运行
  
///  
  
///  程序路径.
  
///  服务名
  
///  服务显示名称.
  
///  服务安装是否成功.
   public  bool InstallService( string svcPath,  string svcName,  string svcDispName)
  {
    #region Constants declaration.
    int SC_MANAGER_CREATE_SERVICE = 0x0002;
    int SERVICE_WIN32_OWN_PROCESS = 0x00000010;
    // int SERVICE_DEMAND_START = 0x00000003;
    int SERVICE_ERROR_NORMAL = 0x00000001;
    int STANDARD_RIGHTS_REQUIRED = 0xF0000;
    int SERVICE_QUERY_CONFIG = 0x0001;
    int SERVICE_CHANGE_CONFIG = 0x0002;
    int SERVICE_QUERY_STATUS = 0x0004;
    int SERVICE_ENUMERATE_DEPENDENTS = 0x0008;
    int SERVICE_START =0x0010;
    int SERVICE_STOP =0x0020;
    int SERVICE_PAUSE_CONTINUE =0x0040;
    int SERVICE_INTERROGATE =0x0080;
    int SERVICE_USER_DEFINED_CONTROL =0x0100;
    int SERVICE_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED | 
    SERVICE_QUERY_CONFIG |
    SERVICE_CHANGE_CONFIG |
    SERVICE_QUERY_STATUS | 
    SERVICE_ENUMERATE_DEPENDENTS | 
    SERVICE_START | 
    SERVICE_STOP | 
    SERVICE_PAUSE_CONTINUE | 
    SERVICE_INTERROGATE | 
    SERVICE_USER_DEFINED_CONTROL);
    int SERVICE_AUTO_START = 0x00000002;
    #endregion Constants declaration.
    try
   {
    IntPtr sc_handle = OpenSCManager( null, null,SC_MANAGER_CREATE_SERVICE);
     if (sc_handle.ToInt32() != 0)
    {
     IntPtr sv_handle = CreateService(sc_handle,svcName,svcDispName,SERVICE_ALL_ACCESS,SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START,SERVICE_ERROR_NORMAL,svcPath, null,0, null, null, null);
      if(sv_handle.ToInt32() ==0)
     {
      CloseServiceHandle(sc_handle);
       return  false;
     }
      else
     {
       // 试尝启动服务
       int i = StartService(sv_handle,0, null);
       if(i==0)
      {
        return  false;
      }
      CloseServiceHandle(sc_handle);
       return  true;
     }
    }
     else
      return  false;
   }
    catch(Exception e)
   {
     throw e;
   }
  }
   ///  
  
///  反安装服务.
  
///  
  
///  服务名.
   public  bool UnInstallService( string svcName)
  {
    int GENERIC_WRITE = 0x40000000;
   IntPtr sc_hndl = OpenSCManager( null, null,GENERIC_WRITE);
    if(sc_hndl.ToInt32() !=0)
   {
     int DELETE = 0x10000;
    IntPtr svc_hndl = OpenService(sc_hndl,svcName,DELETE);
     if(svc_hndl.ToInt32() !=0)
    { 
      int i = DeleteService(svc_hndl);
      if (i != 0)
     {
      CloseServiceHandle(sc_hndl);
       return  true;
     }
      else
     {
      CloseServiceHandle(sc_hndl);
       return  false;
     }
    }
     else
      return  false;
   }
    else
     return  false;
  } 
 }



我用C#写了一个服务,用定时器定时检测,不符合某个条件我就退出服务。

下面的示例使用 ServiceController 类检查 Telnet 服务的当前状态。如果该服务已停止,此示例将启动该服务。如果该服务正在运行,此示例将停止该服务。

//  Toggle the Telnet service - 
//  If it is started (running, paused, etc), stop the service.
//  If it is stopped, start the service.

ServiceController sc =  new ServiceController("Telnet");
Console.WriteLine("The Telnet service status is currently set to {0}", 
sc.Status.ToString());

if ((sc.Status.Equals(ServiceControllerStatus.Stopped)) ||
    (sc.Status.Equals(ServiceControllerStatus.StopPending)))
{
   //  Start the service if the current status is stopped.

  Console.WriteLine("Starting the Telnet service ");
  sc.Start();

else
{
   //  Stop the service if its status is not set to "Stopped".

  Console.WriteLine("Stopping the Telnet service ");
  sc.Stop();


//  Refresh and display the current service status.
sc.Refresh();
Console.WriteLine("The Telnet service status is now set to {0}.", sc.Status.ToString());


Windows服务开发相关文章收集
 
来源:http://www.cnblogs.com/shiningrise/archive/2007/08/16/857762.html


用C#创建Windows服务(Windows Services)(本文最通俗易懂)
http://www.cnblogs.com/caca/archive/2005/02/25/109028.html 


用.Net开发Windows服务初探 
http://fineboy.cnblogs.com/archive/2005/08/12/213462.aspx


可插拔windows服务 
http://www.cnblogs.com/lodestar/archive/2007/04/18/718615.html


windows服务安装类代码
http://www.cnblogs.com/jjstar/articles/20353.html


.Net下的Windows服务程序开发指南 
http://www.cnblogs.com/wuxilin/archive/2006/06/04/416838.html


可插拔windows服务 
http://www.cnblogs.com/lodestar/archive/2007/04/18/718615.html


[C#]Windows服务程序[转载西门吹雪的好文章] 
http://www.cnblogs.com/lisugar/archive/2004/11/22/66953.html


如何实现Windows服务 
http://www.cnblogs.com/baiguli/archive/2007/02/16/651744.aspx
 




本文转自钢钢博客园博客,原文链接:http://www.cnblogs.com/xugang/archive/2007/11/20/965927.html,如需转载请自行联系原作者
相关文章
|
18天前
|
开发框架 算法 Java
.NET 开发:实现高效能的秘诀
【7月更文挑战第4天】探索.NET高效开发涉及理解运行时(如GC、JIT)、代码与算法优化及工具利用。关键点包括适应性垃圾回收、异步编程、明智的并发控制;编写高效代码(避免对象创建,选对数据结构和算法);使用性能分析工具,善用高性能框架如ASP.NET Core,并借助云服务和CI/CD流程持续优化。性能优化是持续学习与实践的过程。
27 1
EMQ
|
10天前
|
物联网 Linux C语言
在 Windows 平台搭建 MQTT 服务
NanoMQ 有着强大的跨平台和可兼容能力,不仅可以用于以 Linux 为基础的各类平台,也为 Windows 平台提供了 MQTT 服务的新选择。
EMQ
56 7
在 Windows 平台搭建 MQTT 服务
|
15天前
|
Linux Apache C++
FFmpeg开发笔记(三十五)Windows环境给FFmpeg集成libsrt
该文介绍了如何在Windows环境下为FFmpeg集成SRT协议支持库libsrt。首先,需要安装Perl和Nasm,然后编译OpenSSL。接着,下载libsrt源码并使用CMake配置,生成VS工程并编译生成srt.dll和srt.lib。最后,将编译出的库文件和头文件按照特定目录结构放置,并更新环境变量,重新配置启用libsrt的FFmpeg并进行编译安装。该过程有助于优化直播推流的性能,减少卡顿问题。
46 2
FFmpeg开发笔记(三十五)Windows环境给FFmpeg集成libsrt
|
10天前
|
安全 Windows
Microsoft Windows远程桌面服务远程执行代码漏洞(CVE-2019-0708)
Microsoft Windows远程桌面服务远程执行代码漏洞(CVE-2019-0708)
17 2
|
11天前
|
存储 NoSQL Redis
【Azure Developer】一个复制Redis Key到另一个Redis服务的工具(redis_copy_net8)
介绍一个简单的工具,用于将Redis数据从一个redis端点复制到另一个redis端点,基于原始存储库转换为.NET 8:https://github.com/LuBu0505/redis-copy-net8
|
18天前
|
人工智能 前端开发 Devops
NET技术在现代开发中的影响力日益增强,本文聚焦其核心价值,如多语言支持、强大的Visual Studio工具、丰富的类库和跨平台能力。
【7月更文挑战第4天】**.NET技术在现代开发中的影响力日益增强,本文聚焦其核心价值,如多语言支持、强大的Visual Studio工具、丰富的类库和跨平台能力。实际应用涵盖企业系统、Web、移动和游戏开发,以及云服务。面对性能挑战、容器化、AI集成及跨平台竞争,.NET持续创新,开发者应关注技术趋势,提升技能,并参与社区,共同推进技术发展。**
16 1
|
18天前
|
机器学习/深度学习 人工智能 开发者
.NET 技术:为开发带来新机遇
【7月更文挑战第4天】**.NET技术开启软件开发新篇章,通过跨平台革命(.NET Core, Xamarin, .NET MAUI)、云服务与微服务(Azure, DevOps, Docker)及AI集成(ML.NET, 认知服务, TensorFlow)为开发者创造新机遇。开源社区的繁荣与性能提升使.NET更具竞争力,推动智能应用的创新与发展。开发者需紧跟潮流,利用这些工具和框架构建高效、创新的解决方案。**
15 1
|
16天前
|
C# 开发者 Windows
4款.NET开源、功能强大的Windows桌面工具箱
4款.NET开源、功能强大的Windows桌面工具箱
|
17天前
|
NoSQL Redis Windows
Windows设置Redis服务使其开机自启
Windows设置Redis服务使其开机自启
25 0
|
21天前
|
C# 开发者 Windows
WPF在.NET9中的重大更新:Windows 11 主题
这也是一个很好的学习WPF的项目,可以通过看源代码提升自己的WPF水平。 WPF Gallery演示如何在标记中指定 XAML 控件,因为每个控件页都显示用于创建每个示例的标记。它还将显示您的应用程序的所有可能的布局选项。 WPF Gallery应用还包含有关使用颜色、排版和图标开发特殊应用程序的设计指南。它还包括一个示例页,用于演示如何使用不同的控件在 WPF 应用程序中创建用户界面。 WPF在.NET 9中可以使用Win11主题的控件了,有助于WPF开发者们开发出更符合现在设计风格、更美观的界面。 希望WPF越来越好。
25 0