加入收藏 | 网站地图 | | RSS | WAP
你好,游客 登录 注册 搜索
背景:
阅读内容  领跑条码、标签打印软件 | 来电弹出客户资料

EXE程序能不能直接作为Windows服务运行?

[日期:2014-02-13] 作者: 来源: [字体: ]

大家都知道.net中如果要制作windows服务程序,那么开发过程和普通exe程序的实现不太一样,并且要实现windows服务程序的N多个预置接口方可作为windows服务程序运行。那么有没有办法让任何的exe程序直接作为windows服务来运行呢?

以下源代码可以实现exe作为windows服务的安装、运行、停止、卸载功能。

1.安装功能:

string[] cmdline = { };
                string serviceFileName = txtPath.Text.Trim();
                string serviceName = GetServiceName(serviceFileName);
                if (string.IsNullOrEmpty(serviceName))
                {
                    txtTip.Text = "指定文件不是Windows服务!";
                    return;
                }
                if (ServiceIsExisted(serviceName))
                {
                    txtTip.Text = "要安装的服务已经存在!";
                    return;
                }
                TransactedInstaller transactedInstaller = new TransactedInstaller();
                AssemblyInstaller assemblyInstaller = new AssemblyInstaller(serviceFileName, cmdline);
                transactedInstaller.Installers.Add(assemblyInstaller);
                transactedInstaller.Install(new System.Collections.Hashtable());
                txtTip.Text = "服务安装成功!";

/// <summary>
        /// 获取Windows服务的名称
        /// </summary>
        /// <param name="serviceFileName">文件路径</param>
        /// <returns>服务名称</returns>
        private string GetServiceName(string serviceFileName)
        {
            try
            {
                Assembly assembly = Assembly.LoadFrom(serviceFileName);
                Type[] types = assembly.GetTypes();
                foreach (Type myType in types)
                {
                    if (myType.IsClass && myType.BaseType == typeof(System.Configuration.Install.Installer))
                    {
                        FieldInfo[] fieldInfos = myType.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Default | BindingFlags.Instance | BindingFlags.Static);
                        foreach (FieldInfo myFieldInfo in fieldInfos)
                        {
                            if (myFieldInfo.FieldType == typeof(System.ServiceProcess.ServiceInstaller))
                            {
                                ServiceInstaller serviceInstaller = (ServiceInstaller)myFieldInfo.GetValue(Activator.CreateInstance(myType));
                                return serviceInstaller.ServiceName;
                            }
                        }
                    }
                }
                return "";
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

2.运行功能:

try
            {
                string serviceName = GetServiceName(txtPath.Text.Trim());
                if (string.IsNullOrEmpty(serviceName))
                {
                    txtTip.Text = "指定文件不是Windows服务!";
                    return;
                }
                if (!ServiceIsExisted(serviceName))
                {
                    txtTip.Text = "要运行的服务不存在!";
                    return;
                }
                ServiceController service = new ServiceController(serviceName);
                if (service.Status != ServiceControllerStatus.Running && service.Status != ServiceControllerStatus.StartPending)
                {
                    service.Start();
                    txtTip.Text = "服务运行成功!";
                }
                else
                {
                    txtTip.Text = "服务正在运行!";
                }
            }
            catch (Exception ex)
            {
                txtTip.Text = ex.InnerException.ToString();
            }

/// <summary>
        /// 判断服务是否已经存在
    /// </summary>
        /// <param name="serviceName">服务名称</param>
        /// <returns>bool</returns>
        private bool ServiceIsExisted(string serviceName)
        {
            ServiceController[] services = ServiceController.GetServices();
            foreach (ServiceController s in services)
            {
                if (s.ServiceName == serviceName)
                {
                    return true;
                }
            }
            return false;
        }

3.停止功能:

ry
            {
                string[] cmdline = { };
                string serviceFileName = txtPath.Text.Trim();
                string serviceName = GetServiceName(serviceFileName);
                if (string.IsNullOrEmpty(serviceName))
                {
                    txtTip.Text = "指定文件不是Windows服务!";
                    return;
                }
                if (!ServiceIsExisted(serviceName))
                {
                    txtTip.Text = "要停止的服务不存在!";
                    return;
                }
                ServiceController service = new ServiceController(serviceName);
                if (service.Status == ServiceControllerStatus.Running)
                {
                    service.Stop();
                    txtTip.Text = "服务停止成功!";
                }
                else
                {
                    txtTip.Text = "服务已经停止!";
                }

            }
            catch (Exception ex)
            {
                txtTip.Text = ex.InnerException.ToString();
            }

4.卸载功能:

try
            {
                string[] cmdline = { };
                string serviceFileName = txtPath.Text.Trim();
                string serviceName = GetServiceName(serviceFileName);
                if (string.IsNullOrEmpty(serviceName))
                {
                    txtTip.Text = "指定文件不是Windows服务!";
                    return;
                }
                if (!ServiceIsExisted(serviceName))
                {
                    txtTip.Text = "要卸载的服务不存在!";
                    return;
                }
                TransactedInstaller transactedInstaller = new TransactedInstaller();
                AssemblyInstaller assemblyInstaller = new AssemblyInstaller(serviceFileName, cmdline);
                transactedInstaller.Installers.Add(assemblyInstaller);
                transactedInstaller.Uninstall(null);
                txtTip.Text = "服务卸载成功!";

            }
            catch (Exception ex)
            {
                txtTip.Text = ex.InnerException.ToString();
            }

关键词:服务  运行  exe 

收藏 推荐 打印 | 录入:blue1000 | 阅读:
本文评论   查看全部评论 (0)
表情: 姓名: 字数
点评:
       
评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事/刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款