您的位置:首页 > 移动开发 > Objective-C

一个windows服务程序的编写过程及心得(更新中)

2008-07-24 16:36 495 查看
 
windows服务程序编写流程
       
  1、在Visual Studio 中建立一个新的windows服务项目RemoteServer1    
  2、打开Service1代码视图,里面已经有OnStart和OnStop两个方法了,OnStart就是启动服务时要做的事,OnStop是关闭服务时要做的事。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

(我做的服务大的框架是监视一个文件夹,只要里面有新的.txt文件就读出它的内容,然后将其删掉。这就要用到文件监视FileSystemWatcher了,顺便又学习了一下文件监视的知识。)

  3、切换到设计视图,右键-添加安装程序    
  4、切换到新生成的ProjectInstaller.cs设计视图,找到serviceProcessInstaller1对Account属性设置为LocalSystem,对serviceInstaller1的ServiceName属性设置为RemoteServer1(服务的名字),StartType属性设置为Automatic(系统启动的时候自动启动服务)      
  【6、建立一个新的安装项目RemoteServerSetup(我们为刚才那个服务建立一个安装项目)    
  7、右键-添加-项目输出-主输出-选择RemoteService1-确定    
  8、右键-视图-自定义操作-自定义操作上右键-添加自定义操作-打开应用程序文件夹-选择刚才那个主输出-确定    
  9、重新生成这个安装项目-右键-安装】

6到9步为上网查的资料,我的做法是点项目右键的编译生成,如果没有错误就会生成一个和项目同名的.exe文件,用Visual Studio Tools里的命令编译器运行如下命令:

installutil 上面.exe文件完整的路径

(卸载服务是installutil /u 上面.exe文件完整的路径)

10、在服务管理器中(我的电脑-右键-管理-服务和应用程序-服务)找到RemoteServer1服务,启动服务

 
 

注意:

1.              如果要一次生成多个服务,要将RemoteService.Designer.cs文件中的
        this.ServiceName = "RemoteService1"; 删掉。
2.   需要一次生成多个服务时,不能调用静态方法,否则多个服务共用一个存储区。(比如生成日志文件的方法,如果将其设置成静态的,日志将生成到最后启动的服务的日志文件里)
3.   在OnStop()方法里也要有关闭每个服务的代码。
4.   最好在OnStart()和OnStop()中都写上try..catch,在catch中用System.Environment.Exit(0)结束。否则这两部分出错了服务就有可能死在那里,删也删不掉。
5.              服务程序有改动后,要重新编译,在重新编译之前把服务要关掉。

6.              在OnStart()中如果程序出错或捕捉到异常要用System.Environment.Exit(0);停止服务,在程序别的地方出现问题用Return;就行了。

 
文件监视:

FileSystemWatcher m_FileWatcher = new FileSystemWatcher();

 

//文件监视事件,括号里为方法名(触发的事件),在这个方法中写具体的操作

FileSystemEventHandler m_fileSystemEvent = new FileSystemEventHandle(fileSystemWatcher1_Created);

 

string m_path =“”; //监视的文件夹的路径

 

m_FileWatcher.BeginInit();

m_FileWatcher.Path = m_path;

m_FileWatcher.Created += m_fileSystemEvent;   //  .Changed/.Deleted/.Disposed/.Renamed

m_FileWatcher.EnableRaisingEvents = true;         //文件监视事件可以运行

m_FileWatcher.EndInit();

 

private void fileSystemWatcher1_Created(object sender, FileSystemEventArgs e)

{

m_FileWatcher.WaitForChanged(System.IO.WatcherChangeTypes.Changed, 500);

}
 
由于本项目还在测试和维护中,以后遇到的问题及解决方法也会更新到这篇文章中
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息