<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_aierong原创技术随笔</title><subtitle type="text">.net,Flex,Fms,视频会议,视频聊天相关开发技术大本营</subtitle><id>http://feed.cnblogs.com/blog/u/1433/rss</id><updated>2012-05-28T07:38:23Z</updated><author><name>aierong</name><uri>http://www.cnblogs.com/aierong/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/aierong/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/1433/rss"/><entry><id>http://www.cnblogs.com/aierong/archive/2012/05/28/2521409.html</id><title type="text">创建Windows服务(Windows Services)N种方式总结</title><summary type="text">最近由于工作需要，写了一些windows服务程序，有一些经验，我现在总结写出来。目前我知道的创建创建Windows服务有3种方式:a.利用.net框架类ServiceBaseb.利用组件Topshelfc.利用小工具instsrv和srvany下面我利用这3种方式,分别做一个windows服务程序，程序功能就是每隔5秒往程序目录下记录日志:a.利用.net框架类ServiceBase本方式特点:简单，兼容性好通过继承.net框架类ServiceBase实现第1步: 新建一个Windows服务 public partial class Service1 : ServiceBase {...</summary><published>2012-05-28T07:38:00Z</published><updated>2012-05-28T07:38:00Z</updated><author><name>aierong</name><uri>http://www.cnblogs.com/aierong/</uri></author><link rel="alternate" href="http://www.cnblogs.com/aierong/archive/2012/05/28/2521409.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/aierong/archive/2012/05/28/2521409.html"/><content type="html">&lt;p&gt;最近由于工作需要，写了一些windows服务程序，有一些经验，我现在总结写出来。&lt;br /&gt;目前我知道的创建创建Windows服务有3种方式:&lt;br /&gt;a.利用.net框架类ServiceBase&lt;br /&gt;b.利用组件Topshelf&lt;br /&gt;c.利用小工具instsrv和srvany&lt;/p&gt;&lt;p&gt;下面我利用这3种方式,分别做一个windows服务程序，程序功能就是每隔5秒往程序目录下记录日志:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="background-color: #ffffff;"&gt;&lt;strong&gt;a.利用.net框架类ServiceBase&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;本方式特点:简单，兼容性好&lt;/span&gt;&lt;/p&gt;&lt;p&gt;通过继承.net框架类ServiceBase实现&lt;/p&gt;&lt;p&gt;第1步: 新建一个Windows服务&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;partial&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; Service1 : ServiceBase&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;readonly&lt;/span&gt;&lt;span style="color: #000000;"&gt; Timer _timer;&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;readonly&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; FileName = Path.GetDirectoryName ( Assembly.GetExecutingAssembly ( ).Location ) + &lt;span style="color: #800000;"&gt;@"&lt;/span&gt;&lt;span style="color: #800000;"&gt;\&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;test.txt&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; Service1 ( )&lt;br/&gt;        {&lt;br/&gt;            InitializeComponent ( );&lt;br/&gt;&lt;br/&gt;            _timer &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Timer ( &lt;span style="color: #800080;"&gt;5000&lt;/span&gt;&lt;span style="color: #000000;"&gt; )&lt;br/&gt;            {&lt;br/&gt;                AutoReset &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt; ,&lt;br/&gt;                Enabled &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;            };&lt;br/&gt;&lt;br/&gt;            _timer.Elapsed &lt;/span&gt;+= &lt;span style="color: #0000ff;"&gt;delegate&lt;/span&gt; ( &lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; sender , ElapsedEventArgs e )&lt;br/&gt;            {&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.witre ( &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.Format ( &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Run DateTime {0}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; , DateTime.Now ) );&lt;br/&gt;            };&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; OnStart ( &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; [ ] args )&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.witre ( &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.Format ( &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Start DateTime {0}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; , DateTime.Now ) );&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; OnStop ( )&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.witre ( &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.Format ( &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Stop DateTime {0}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; , DateTime.Now ) +&lt;span style="color: #000000;"&gt; Environment.NewLine );&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; witre ( &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; context )&lt;br/&gt;        {&lt;br/&gt;            StreamWriter sw &lt;/span&gt;=&lt;span style="color: #000000;"&gt; File.AppendText ( FileName );&lt;br/&gt;            sw.WriteLine ( context );&lt;br/&gt;            sw.Flush ( );&lt;br/&gt;            sw.Close ( );&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;p&gt;第2步: 添加Installer&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;    [RunInstaller ( &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt; )]&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;partial&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; Installer1 : System.Configuration.Install.Installer&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; ServiceInstaller serviceInstaller;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; ServiceProcessInstaller processInstaller;&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; Installer1 ( )&lt;br/&gt;        {&lt;br/&gt;            InitializeComponent ( );&lt;br/&gt;&lt;br/&gt;            processInstaller &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; ServiceProcessInstaller ( );&lt;br/&gt;            serviceInstaller &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; ServiceInstaller ( );&lt;br/&gt;&lt;br/&gt;            processInstaller.Account &lt;/span&gt;=&lt;span style="color: #000000;"&gt; ServiceAccount.LocalSystem;&lt;br/&gt;            serviceInstaller.StartType &lt;/span&gt;=&lt;span style="color: #000000;"&gt; ServiceStartMode.Automatic;&lt;br/&gt;&lt;br/&gt;            serviceInstaller.ServiceName &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;my_WindowsService&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            serviceInstaller.Description &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;WindowsService_Description&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            serviceInstaller.DisplayName &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;WindowsService_DisplayName&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;br/&gt;            Installers.Add ( serviceInstaller );&lt;br/&gt;            Installers.Add ( processInstaller );&lt;br/&gt;        }  &lt;br/&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;p&gt;第3步:安装,卸载 &lt;br /&gt;Cmd命令&lt;br /&gt;installutil&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WindowsService_test.exe&amp;nbsp; (安装Windows服务)&lt;br /&gt;installutil /u&amp;nbsp;&amp;nbsp; WindowsService_test.exe&amp;nbsp; (卸载Windows服务)&lt;/p&gt;&lt;p&gt;代码下载:http://files.cnblogs.com/aierong/WindowsService_test.rar&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="background-color: #ffffff;"&gt;&lt;strong&gt;b.利用组件Topshelf&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;本方式特点:代码简单,开源组件,Windows服务可运行多个实例&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Topshelf是一个开源的跨平台的服务框架，支持Windows和Mono，只需要几行代码就可以构建一个很方便使用的服务. 官方网站:http://topshelf-project.com&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;第1步:引用程序集TopShelf.dll和log4net.dll&lt;/p&gt;&lt;p&gt;第2步:创建一个服务类MyClass,里面包含两个方法Start和Stop,还包含一个定时器Timer,每隔5秒往文本文件中写入字符&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; MyClass&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;readonly&lt;/span&gt;&lt;span style="color: #000000;"&gt; Timer _timer;&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;readonly&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; FileName = Directory.GetCurrentDirectory ( ) + &lt;span style="color: #800000;"&gt;@"&lt;/span&gt;&lt;span style="color: #800000;"&gt;\&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;test.txt&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; MyClass ( )&lt;br/&gt;        {&lt;br/&gt;            _timer &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Timer ( &lt;span style="color: #800080;"&gt;5000&lt;/span&gt;&lt;span style="color: #000000;"&gt; )&lt;br/&gt;            {&lt;br/&gt;                AutoReset &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt; ,&lt;br/&gt;                Enabled &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;            };&lt;br/&gt;&lt;br/&gt;            _timer.Elapsed &lt;/span&gt;+= &lt;span style="color: #0000ff;"&gt;delegate&lt;/span&gt; ( &lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; sender , ElapsedEventArgs e )&lt;br/&gt;            {&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.witre ( &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.Format ( &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Run DateTime {0}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; , DateTime.Now ) );&lt;br/&gt;            };&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; witre ( &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; context )&lt;br/&gt;        {&lt;br/&gt;            StreamWriter sw &lt;/span&gt;=&lt;span style="color: #000000;"&gt; File.AppendText ( FileName );&lt;br/&gt;            sw.WriteLine ( context );&lt;br/&gt;            sw.Flush ( );&lt;br/&gt;            sw.Close ( );&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Start ( )&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.witre ( &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.Format ( &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Start DateTime {0}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; , DateTime.Now ) );&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Stop ( )&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.witre ( &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.Format ( &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Stop DateTime {0}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; , DateTime.Now ) +&lt;span style="color: #000000;"&gt; Environment.NewLine );&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;p&gt;第3步:使用Topshelf宿主我们的服务，主要是Topshelf如何设置我们的服务的配置和启动和停止的时候的方法调用&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;    &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; Program&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; Main ( &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; [ ] args )&lt;br/&gt;        {&lt;br/&gt;            HostFactory.Run ( x &lt;/span&gt;=&amp;gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;            {&lt;br/&gt;                x.Service&lt;/span&gt;&amp;lt;MyClass&amp;gt; ( ( s ) =&amp;gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;                {&lt;br/&gt;                    s.SetServiceName ( &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;ser&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; );&lt;br/&gt;                    s.ConstructUsing ( name &lt;/span&gt;=&amp;gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; MyClass ( ) );&lt;br/&gt;                    s.WhenStarted ( ( t ) &lt;/span&gt;=&amp;gt;&lt;span style="color: #000000;"&gt; t.Start ( ) );&lt;br/&gt;                    s.WhenStopped ( ( t ) &lt;/span&gt;=&amp;gt;&lt;span style="color: #000000;"&gt; t.Stop ( ) );&lt;br/&gt;                } );&lt;br/&gt;&lt;br/&gt;                x.RunAsLocalSystem ( );&lt;br/&gt;&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;服务的描述&lt;/span&gt;&lt;br/&gt;                x.SetDescription ( &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Topshelf_Description&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; );&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;服务的显示名称&lt;/span&gt;&lt;br/&gt;                x.SetDisplayName ( &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Topshelf_DisplayName&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; );&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;服务名称&lt;/span&gt;&lt;br/&gt;                x.SetServiceName ( &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Topshelf_ServiceName&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; );&lt;br/&gt;&lt;br/&gt;            } );&lt;br/&gt;        }&lt;br/&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;p&gt;第4步: cmd命令&lt;/p&gt;&lt;p&gt;ConsoleApp_Topshelf.exe&amp;nbsp; install&amp;nbsp;&amp;nbsp;&amp;nbsp; (安装Windows服务)&lt;/p&gt;&lt;p&gt;ConsoleApp_Topshelf.exe&amp;nbsp; uninstall&amp;nbsp; (卸载Windows服务)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;代码下载:http://files.cnblogs.com/aierong/ConsoleApp_Topshelf.rar&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;c.利用小工具instsrv和srvany &lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;本方式特点:代码超级简单,WindowsForm程序即可,并支持程序交互(本人最喜欢的特点),好像不支持win7,支持xp win2003&lt;/span&gt;&lt;/p&gt;&lt;p&gt;首先介绍2个小工具:&lt;/p&gt;&lt;p&gt;instsrv.exe:用以安装和卸载可执行的服务&lt;/p&gt;&lt;p&gt;srvany.exe:用于将任何EXE程序作为Windows服务运行&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;这2个工具都是是Microsoft Windows Resource Kits工具集的实用的小工具&amp;nbsp;&lt;/p&gt;&lt;p&gt;你可以通过下载并安装Microsoft Windows Resource Kits获得 &lt;a href="http://www.microsoft.com/en-us/download/details.aspx?id=17657"&gt;http://www.microsoft.com/en-us/download/details.aspx?id=17657&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;第1步: 新建WindowsForm程序&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;   &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;partial&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; Form1 : Form&lt;br/&gt;    {&lt;br/&gt;        Timer _timer;&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;readonly&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; FileName = Application.StartupPath + &lt;span style="color: #800000;"&gt;@"&lt;/span&gt;&lt;span style="color: #800000;"&gt;\&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;test.txt&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; Form1 ( )&lt;br/&gt;        {&lt;br/&gt;            InitializeComponent ( );&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; Form1_Load ( &lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; sender , EventArgs e )&lt;br/&gt;        {&lt;br/&gt;            _timer &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Timer ( )&lt;br/&gt;            {&lt;br/&gt;                Enabled &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt; ,&lt;br/&gt;                Interval &lt;/span&gt;= &lt;span style="color: #800080;"&gt;5000&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;            };&lt;br/&gt;&lt;br/&gt;            _timer.Tick &lt;/span&gt;+= &lt;span style="color: #0000ff;"&gt;delegate&lt;/span&gt; ( &lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; _sender , EventArgs _e )&lt;br/&gt;            {&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.witre ( &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.Format ( &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Run DateTime {0}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; , DateTime.Now ) );&lt;br/&gt;            };&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; _timer_Tick ( &lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; sender , EventArgs e )&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; NotImplementedException ( );&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; witre ( &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; context )&lt;br/&gt;        {&lt;br/&gt;            StreamWriter sw &lt;/span&gt;=&lt;span style="color: #000000;"&gt; File.AppendText ( FileName );&lt;br/&gt;            sw.WriteLine ( context );&lt;br/&gt;            sw.Flush ( );&lt;br/&gt;            sw.Close ( );&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; button1_Click ( &lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; sender , EventArgs e )&lt;br/&gt;        {&lt;br/&gt;            MessageBox.Show ( &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Hello&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; );&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;第2步:安装,卸载&lt;/p&gt;&lt;p&gt;服务的安装步骤分5小步:&lt;/p&gt;&lt;p&gt;(1)打开CMD,输入以下内容，其中WindowsForms_WindowsService为你要创建的服务名称&lt;/p&gt;&lt;p&gt;格式:目录绝对路径\instsrv &amp;nbsp;WindowsForms_WindowsService&amp;nbsp; 目录绝对路径\srvany.exe&lt;/p&gt;&lt;p&gt;例如:&lt;/p&gt;&lt;p&gt;D:\TempWork\win\Debug\instsrv.exe &amp;nbsp;WindowsForms_WindowsService &amp;nbsp;D:\TempWork\win\Debug\srvany.exe&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;(2)regedit打开注册表编辑器,找到以下目录&lt;/p&gt;&lt;p&gt;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WindowsForms_WindowsService&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;(3)鼠标右键单击WindowsForms_WindowsService，创建一个"项"，名称为"Parameters"&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;(4)鼠标左键单击"Parameters",在右边点击鼠标右键，创建一个"字符串值"(REG_SZ)，名称为"Application"，数值数据里填写目录下可执行文件的绝对路径+文件名&lt;/p&gt;&lt;p&gt;例如:&lt;/p&gt;&lt;p&gt;D:\TempWork\win\Debug\WindowsFormsApplication_Exe.exe&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;(5)打开services.msc服务控制面板，找到WindowsForms_WindowsService服务，鼠标右键-属性-登陆，勾选"允许服务与桌面交互"&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;启动服务,可以看到程序界面&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/732/2012052815265286.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;卸载服务&lt;/p&gt;&lt;p&gt;D:\TempWork\win\Debug\instsrv.exe WindowsForms_WindowsService REMOVE&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;代码下载:http://files.cnblogs.com/aierong/WindowsFormsApplication_Exe.rar&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/aierong/aggbug/2521409.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/aierong/archive/2012/05/28/2521409.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/aierong/archive/2009/08/21/1551589.html</id><title type="text">.NET中对串口(COM)读写操作方式汇总</title><summary type="text">.NET中对串口(COM)读写操作方式汇总</summary><published>2009-08-21T09:41:00Z</published><updated>2009-08-21T09:41:00Z</updated><author><name>aierong</name><uri>http://www.cnblogs.com/aierong/</uri></author><link rel="alternate" href="http://www.cnblogs.com/aierong/archive/2009/08/21/1551589.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/aierong/archive/2009/08/21/1551589.html"/><content type="text">.NET中对串口(COM)读写操作方式汇总</content></entry><entry><id>http://www.cnblogs.com/aierong/archive/2009/03/30/1425271.html</id><title type="text">Sql Server2008 Transact-SQL 新兵器学习总结之-用户定义表类型和日期,时间数据类型</title><summary type="text">Sql Server2008 Transact-SQL 新兵器学习总结之-用户定义表类型和日期,时间数据类型</summary><published>2009-03-30T08:31:00Z</published><updated>2009-03-30T08:31:00Z</updated><author><name>aierong</name><uri>http://www.cnblogs.com/aierong/</uri></author><link rel="alternate" href="http://www.cnblogs.com/aierong/archive/2009/03/30/1425271.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/aierong/archive/2009/03/30/1425271.html"/><content type="text">Sql Server2008 Transact-SQL 新兵器学习总结之-用户定义表类型和日期,时间数据类型</content></entry><entry><id>http://www.cnblogs.com/aierong/archive/2009/02/20/CameraFlexFlash.html</id><title type="text">Flex(flash)检测摄像头的3种状态(是否被占用,没安装摄像头,正常)</title><summary type="text">系列文章导航Flex,Fms3相关文章索引 Air版免费视频成人聊天室,免费网络远程视频会议系统((Flex,Fms3联合打造)) 在视频程序的编写过程中，我们经常要使用摄像头，在使用摄像头前有必要对摄像头的现有状态做个检测:1.被占用2.没安装摄像头3.正常看下面代码：&lt;?xml version="1.0" encoding="utf-8"?&gt; &lt;mx:WindowedAppl...</summary><published>2009-02-20T00:01:00Z</published><updated>2009-02-20T00:01:00Z</updated><author><name>aierong</name><uri>http://www.cnblogs.com/aierong/</uri></author><link rel="alternate" href="http://www.cnblogs.com/aierong/archive/2009/02/20/CameraFlexFlash.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/aierong/archive/2009/02/20/CameraFlexFlash.html"/><content type="text">系列文章导航Flex,Fms3相关文章索引 Air版免费视频成人聊天室,免费网络远程视频会议系统((Flex,Fms3联合打造)) 在视频程序的编写过程中，我们经常要使用摄像头，在使用摄像头前有必要对摄像头的现有状态做个检测:1.被占用2.没安装摄像头3.正常看下面代码：&lt;?xml version="1.0" encoding="utf-8"?&gt; &lt;mx:WindowedAppl...</content></entry><entry><id>http://www.cnblogs.com/aierong/archive/2009/02/19/flexairsqlite.html</id><title type="text">Flex Air开发SQLite小结,SQLite开发工具及SQLite与Sql Server的语法差异汇总</title><summary type="text">Flex Air开发SQLite小结,SQLite开发工具及SQLite与Sql Server的语法差异汇总</summary><published>2009-02-19T02:47:00Z</published><updated>2009-02-19T02:47:00Z</updated><author><name>aierong</name><uri>http://www.cnblogs.com/aierong/</uri></author><link rel="alternate" href="http://www.cnblogs.com/aierong/archive/2009/02/19/flexairsqlite.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/aierong/archive/2009/02/19/flexairsqlite.html"/><content type="text">Flex Air开发SQLite小结,SQLite开发工具及SQLite与Sql Server的语法差异汇总</content></entry><entry><id>http://www.cnblogs.com/aierong/archive/2009/02/17/chatroomflexfmsair.html</id><title type="text">开源Flex Air版免费激情美女视频聊天室,免费网络远程视频会议系统((Flex,Fms3联合打造))&lt;视频聊天,会议开发实例6&gt;</title><summary type="text">开源Flex Air版免费激情美女视频聊天室,免费网络远程视频会议系统((Flex,Fms3联合打造))</summary><published>2009-02-17T07:40:00Z</published><updated>2009-02-17T07:40:00Z</updated><author><name>aierong</name><uri>http://www.cnblogs.com/aierong/</uri></author><link rel="alternate" href="http://www.cnblogs.com/aierong/archive/2009/02/17/chatroomflexfmsair.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/aierong/archive/2009/02/17/chatroomflexfmsair.html"/><content type="text">开源Flex Air版免费激情美女视频聊天室,免费网络远程视频会议系统((Flex,Fms3联合打造))</content></entry><entry><id>http://www.cnblogs.com/aierong/archive/2009/02/13/ChatRoomFlexFms.html</id><title type="text">免费网络远程视频会议系统,免费美女多人视频聊天(附源码下载)(Flex和Fms3开发)&lt;视频聊天,会议开发实例5&gt;</title><summary type="text">免费网络远程视频会议系统,免费美女多人视频聊天</summary><published>2009-02-13T00:52:00Z</published><updated>2009-02-13T00:52:00Z</updated><author><name>aierong</name><uri>http://www.cnblogs.com/aierong/</uri></author><link rel="alternate" href="http://www.cnblogs.com/aierong/archive/2009/02/13/ChatRoomFlexFms.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/aierong/archive/2009/02/13/ChatRoomFlexFms.html"/><content type="text">免费网络远程视频会议系统,免费美女多人视频聊天</content></entry><entry><id>http://www.cnblogs.com/aierong/archive/2009/02/11/ItemRenderer.html</id><title type="text">Flex组件的项目渲染器(ItemRenderer)使用总结</title><summary type="text">系列文章导航Flex,Fms3相关文章索引 Air版免费视频成人聊天室,免费网络远程视频会议系统((Flex,Fms3联合打造)) Flex中提供了大量用于数据呈现的组件，这其中，以List系列组件最为常见，使用也最频繁，比如ComBoBox、List、Tree、TileList、DataGrid等等。这些组件有一个共同的特性，那就是支持自定义itemRenderer，这个功能非常强大，能够帮助我...</summary><published>2009-02-11T08:49:00Z</published><updated>2009-02-11T08:49:00Z</updated><author><name>aierong</name><uri>http://www.cnblogs.com/aierong/</uri></author><link rel="alternate" href="http://www.cnblogs.com/aierong/archive/2009/02/11/ItemRenderer.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/aierong/archive/2009/02/11/ItemRenderer.html"/><content type="text">系列文章导航Flex,Fms3相关文章索引 Air版免费视频成人聊天室,免费网络远程视频会议系统((Flex,Fms3联合打造)) Flex中提供了大量用于数据呈现的组件，这其中，以List系列组件最为常见，使用也最频繁，比如ComBoBox、List、Tree、TileList、DataGrid等等。这些组件有一个共同的特性，那就是支持自定义itemRenderer，这个功能非常强大，能够帮助我...</content></entry><entry><id>http://www.cnblogs.com/aierong/archive/2009/02/11/1388277.html</id><title type="text">推荐几个Adobe Flex Builder 3的插件(代码格式化和fms服务器通讯文件(main.asc)编写)</title><summary type="text">系列文章导航Sql Server2005 Transact-SQL 新兵器学习总结之-总结 Flex,Fms3相关文章索引免费美女视频聊天,多人视频会议功能加强版本(Fms3和Flex开发(附源码)) 1.Fms plugins编写FMS服务器端脚本时，最头疼的莫过于AS1的语法了。习惯了AS2、3后，在没有代码提示的环境下，写代码确实是件很头疼的事，这个插件就可以发挥作用了。 Flash Med...</summary><published>2009-02-11T07:42:00Z</published><updated>2009-02-11T07:42:00Z</updated><author><name>aierong</name><uri>http://www.cnblogs.com/aierong/</uri></author><link rel="alternate" href="http://www.cnblogs.com/aierong/archive/2009/02/11/1388277.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/aierong/archive/2009/02/11/1388277.html"/><content type="text">系列文章导航Sql Server2005 Transact-SQL 新兵器学习总结之-总结 Flex,Fms3相关文章索引免费美女视频聊天,多人视频会议功能加强版本(Fms3和Flex开发(附源码)) 1.Fms plugins编写FMS服务器端脚本时，最头疼的莫过于AS1的语法了。习惯了AS2、3后，在没有代码提示的环境下，写代码确实是件很头疼的事，这个插件就可以发挥作用了。 Flash Med...</content></entry><entry><id>http://www.cnblogs.com/aierong/archive/2009/02/09/1386858.html</id><title type="text">Flex组件开发总结-20090209</title><summary type="text">Flex组件开发总结-20090209</summary><published>2009-02-09T07:27:00Z</published><updated>2009-02-09T07:27:00Z</updated><author><name>aierong</name><uri>http://www.cnblogs.com/aierong/</uri></author><link rel="alternate" href="http://www.cnblogs.com/aierong/archive/2009/02/09/1386858.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/aierong/archive/2009/02/09/1386858.html"/><content type="text">Flex组件开发总结-20090209</content></entry></feed>
