zoukankan      html  css  js  c++  java
  • 用C#开发Windows服务、自动安装注册

     

    部分一(Windows服务初探,对于服务安装部分,如果看不明白,不要强看,直接看部分二):

    第一步:
      首先打开Visual Studio并且选择Visual C#工程。选择模板类型为Windows服务,并命名为Monitoring,如下图所示:

      第二步:
      按F7键打开代码窗口。然后,加入对System.IO命名空间的引用,以便把系统定时功能编写到一个文件中。下一步,用Monitoring一词替换所有出现的Service1一词。之后,转入设计模式(按键shift+F7)。选择Solution Explorer(按键Ctrl+Alt+L)。点击Service1.cs并且命名它为Monitoring.cs。
      之后,转入代码窗口。在OnStart事件中加入下列代码,如下图所示:

    点击放大此图片

      在OnStart事件中实现的功能
      首先,在c盘上创建一个xml文件,并命名为file1。然后,在这个文件中建立如下代码:

    <?xml version="1.0" encoding="utf-8" standalone="no"?>
    <times>

      然后,关闭它。
      我创建了一个服务,它能够在系统启动时自动启动并且记录下启动时间。当系统关闭时,它也关闭。而且,它会记录下关闭时间和系统中所花费的时间。
      首先,我要创建一个StreamWriter来把系统启动时间写入file1.xml文件中。
      在把代码复制到你的OnStart事件后,正好在Monitoring构造器的上面创建一个公共变量temp,如下图所示:

    点击放大此图片

      此后,把这部分代码复制到你的代码窗口:
      再把下面代码复制到OnStart事件中,如下图所示:

    StreamWriter writer=File.AppendText("d:\\file1.xml");
    writer.Write("<time>");
    writer.WriteLine("<Date> "+ (DateTime.Now.ToString("dd-MM-yy"))+"</Date>");
    writer.WriteLine("<started> "+ (DateTime.Now.ToString("t"))+"</started>");
    temp=DateTime.Now;
    writer.Close();

    点击放大此图片

      在OnShutdown事件中实现的功能
      当系统要关闭时,我使用一个StreamWriter再次打开file1.xml-它将记下系统关闭时间,还将记下在系统启动和关闭之间所花费的时间跨度。我在OnStart和OnShutdown事件中使用了一个temp变量。在OnStart中,它用于存储启动时间。然后,它被再次用于OnShutdown事件中来记下系统启动和关闭之间所花费的时间间隔。
      然后,我们必须配置我们的Windows服务以便安装和运行。
      因此,首先转到设计视图中,并选择属性窗口(可以按下F4)。
      把CanStop和CanShutdown设置为true。在安装之前,我们必须要安装一个安装程序。
      右击设计视图窗口,然后选择"Add Installer"。然后,它将显示ProjectInstaller.cs。在这个文件中,serviceInstaller1和serviceProcessInstaller1都存在。转到serviceProcessInstaller1属性处:
      ・ 把Account设置为LocalSystem。
      ・ 然后,转到serviceInstaller1属性处。
      ・ 把DisplayName和ServiceName设置为Monitoring。
      ・ 设置启动类型(StartType)为automatic。
      请参考下图:

    点击放大此图片
    点击放大此图片

      然后,转到VS.NET的命令提示符下。
      在控制台下,转到服务的Debug文件夹下:
      输入"InstallUtil Monitoring.exe"
      如果它显示"Commit Phase Completed Successfully",则说明服务被成功安装。
      然后,重启系统以启动服务。在重启之后,打开file1.xml文件,它记录了系统的开始时间。如果关闭系统,它将记录下系统的关闭时间和使用系统的时间长度。通过这一部分,我们已经完成了记录下系统所消耗的时间。接下来,我们将创建一个web应用程序以便在一个Grid控件中显示xml数

    部分二(Windows服务安装与注册):

    最近一直在搞Windows服务,也有了不少经验,感觉权限方面确定比一般程序要受限很多,但方便性也很多。像后台运行不阻塞系统,不用用户登录之类。哈哈,扯远了,今天讲一下那个怎么给Windows服务做个安装包。为什么做安装包?当然是方便了,不用每次调用InstallUtil,还有,就是看上去正规些。
    不多说了,先来看看怎么做吧。首先,当然是创建一个Windows服务的项目。这个大家应该都知道怎么做(这都不明白的留言问我),然后要给服务“添加安装程序”,如图1所示:(这一步和自己用InstallUtil注册是完全一样的)

    (图1)
    添加后,会出来一个serviceProcessInstal1,还有serviceInstaller1,如果你一个项目里有两个服务的话,这里就会有两个serviceInstaller类,如图2:

    (图2)
    图3是serviceProcessInstal1的属性页,其中Account就是指用于运行服务的帐户,如果只是用于本地,可以选LocalSystem(本地系统),这是本地的最高权限,并可以选择和桌面交互功能。如果安全性考虑的话,请选择适合自己的。

    (图3)
    图4是serviceInstaller2的属性页,其中DisplayName就是显示在Windows服务管理器中的服务名称,Desciption是服务的说明。下面ServiceName是服务内部名称。最关键的是下面的StartType,是指服务的启动方式,是自动,手动和禁用三种。

    (图4)
    下面,就是今天讲的重点了,点击“文件”->“添加”->“新建项目”(如图5)

    (图5)
    选择“其他项目类型”->“安装和部署”里的“安装项目”(如图6)

    (图6)
    建好项目后,右键刚才新建的安装项目,选择“视图”->“文件系统”(如图7)

    (图7)
    这时,打开了文件系统属性。可以看到,屏幕左边,出现了三项文件系统的内容,因为我们是Windows服务程序,不需要在开始菜单和桌面上放置图标,所以我们直接右键“应用程序文件夹”->“添加”->“项目输出”(如图8)

    (图8)
    在出来的对话框中,选择“主输出”和“Release XXX”,这个由你的项目属性决定,一般选择Release Any CPU。(如图9)

    (图9)
    系统会自动把项目输出文件,也就是Windows服务程序的EXE文件和所有引用的类库文件都列在中间的框中。这时,为了方便安装,我们把InstallUtil.exe和两个我自己写的批处理文件一起添加进去。添加方法类似上面,只是把“项目输出”改成“文件”。
    结果如图10所示:

    (图10)
    接下来,就该配置一下安装过程,让安装程序自动给我们安装和卸载Windows服务。
    还是右键安装项目,选“视图”->“自定义操作”,如图11:

    (图11)
    左边的窗口换到了自定义操作的视图了,右键“安装”->“添加自定义操作”(图12),出现的对话框中,选中“应用程序文件夹”,再选中其中的InstallUtil.exe文件(图13),添加好后,会在安装操作下面多出一个InstallUtil.exe的分支。点一下它,在右边的属性页里,设置Arguments=“ 你的Windows服务文件名”,如图14(注意文件名前要留一个空格)

    (图12)

    (图13)

    (图14)
    同样,在提交和卸载处,也添加InstallUtil.exe,不过属性页中设置Arguments=“ -u 你的Windows服务文件名”,这样,安装程序就能实现自动安装注册和卸载Windows服务了。(如图15)

    (图15)
    接下来就该让Windows服务和安装项目同时被编译了。右键点击解决方案,选择“属性”(如图16),在出来的对话框中,勾上安装项目后面的生成。(如图17)

    (图16)

    (图17)
    最后,右键解决方案,选择“生成解决方案”,这时vs会将两个项目都会编译出来。不过要注意一点:项目的启动顺序一定要Windows服务项目在前,安装项目在后。

    联盟快卖 商人,生意人,待创业人士在此可以共赢互利 期待你的加入 群号:140809277
  • 相关阅读:
    5G网络类型 ?
    命令行签名
    软件著作权之源代码
    汗,查了很久的问题,竟然是重载错函数
    终于考完PMP
    ImportError: No module named _tkinter on macos
    numpy.trace对于三维以上array的解析
    ValueError: output parameter for reduction operation logical_and has too many dimensions ?
    numexpr low version warning
    Execution failed for task ':compileDebugAidl'.
  • 原文地址:https://www.cnblogs.com/yexinw/p/2087328.html
Copyright © 2011-2022 走看看