zoukankan      html  css  js  c++  java
  • C#制作 Windows 服务安装程序

    C#制作 Windows 服务安装程序

    2012-07-13 13:31 by 谢中涞, 215 阅读, 0 评论, 收藏编辑

             最近项目中需要使用一些Win服务来处理一些类似于数据同步的业务,对于服务需要执行的业务倒是很容易的按部就班的写完了,在服务的安装部署问题上却费了一番功夫折腾.今天就借此机会在此略微总结下,一方面为后面遇到同样困惑的同学指下路,同时也为了给自己日后提个醒.

            我们先来看一下我们熟悉思维中服务是如何安装的,"installutil 服务路径",没错,我们一般谈到服务安装可能最容易想起的就是这个命令了, 但是当项目越来越大之后, 去安装部署服务的兄弟们也许就不是我们开发人员了, 甚至可能是对.Net 框架完全不熟悉的人,那我们要求对方必选得掌握这个命令就有点让人....

          那么有没有更好的方法呢? 在这个问题上我们走了很多弯路,为了不让大家误入歧途,就直接把正确的步骤放在此吧. 当然这个解决方案也参考了很多前辈高人的意见.

      1.  创建一个Windows安装部署项目,详情略

      2. 在部署项目中选择切换到"文件系统"视图,添加对应的项目输出(如果需要打包多个服务,将每个服务项目的主输出一并添加即可),详情略

      3. 在"文件系统"视图继续中添加 Installutil.exe 这个文件(通常路径在C:\Windows\Microsoft.NET\Framework\v4.0.30319,当然根据你自己的实际选择不同的版本),如下截图

         image

      4.切换到"自定义操作"视图中,对"安装/提交/回滚/卸载"步骤中,依次添加 Installutil.exe 及项目主输出信息.同时需要注意 Installutil.exe 文件应该放在每个步骤中的第一个文件位置,如下截图

          image

       5. 网上有的同学说,还需要设置每个Installutil.exe 的参数,及需要在Installutil.exe 的属性窗口中指定参数,如下截图所示,参数值为当前需要"安装的服务文件名".可以写多个用空格隔开. (卸载参数值为 "–u 服务文件名")

           image

    按照以上步骤确实能安装成功,不过后面我在省略了第五步后,安装也同样成功了,貌似第五步不是必须的.

    在此,我们的服务安装部署就打包完成了.就可以像安装其他普通程序一般一路下一步即可

    imageimageimage

    我们计算机服务列表中也顺利找到了我们的服务,表明确实安装成功了.

    image

    但从上图我们可以看出,还有一点小小问题,我们的服务安装后默认并没有启动,OK,我们再来改一下我们的服务,添加一个安装结束事件,大致代码如下所示

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    /// <summary>
            /// ProjectInstaller
            /// </summary>
            public ProjectInstaller()
            {
                InitializeComponent();
                this.AfterInstall += new InstallEventHandler(ProjectInstaller_AfterInstall);
            }
     
            /// <summary>
            /// 服务程序安装结束执行
            /// </summary>
            /// <param name="sender">事件源</param>
            /// <param name="e">事件参数</param>
            private void ProjectInstaller_AfterInstall(object sender, InstallEventArgs e)
            {
                //服务安装结束 自动启动
                try
                {   //设置服务与桌面交互  否则不能调用有界面的程序
                    ManagementObject wmiService = new ManagementObject(string.Format("Win32_Service.Name='{0}'", ConstValues.SYNC_SERVICE_NAME));
                    ManagementBaseObject changeMethod = wmiService.GetMethodParameters("Change");
                    changeMethod["DesktopInteract"] = true;
                    ManagementBaseObject OutParam = wmiService.InvokeMethod("Change", changeMethod, null);
     
                    //启动服务
                    ServiceController sc = new ServiceController(ConstValues.SYNC_SERVICE_NAME);
                    if (sc.Status.Equals(ServiceControllerStatus.Stopped))
                    {
                        sc.Start();
                    }
                }
                catch
                {
                }
            }

      

    OK,至此,我们所希望的全部功能都已实现,大功告成.

     
    分类: .Net
    标签: 技术笔记
  • 相关阅读:
    1490. Clone N-ary Tree
    1485. Clone Binary Tree With Random Pointer
    *Minimum-cost Flow【网络流】
    2020牛客暑期多校训练营(第一场)
    P2719 搞笑世界杯
    Bus Number【多重集合的排列】
    New Year and Old Subsequence【矩阵+线段树+DP】
    Magic Master【模拟/约瑟夫环】
    The Nth Item【斐波那契】
    Random Access Iterator【树上求概率】
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2590191.html
Copyright © 2011-2022 走看看