zoukankan      html  css  js  c++  java
  • C#判断程序是由Windows服务启动还是用户启动

          在Windows系统做网络开发,很多时候都是使用Windows服务的模式,但在调度阶段,我们更多的是使用控制台的模式。在开发程序的时候,我们在Program的Main入口进行判断。最初开始使用Environment.UserInteractive属性,在系统不系统服务的交互模式时,程序运行是正常的,但试过有Win7下,系统允许交互模式,结果在服务启动的时候,跳转到控制台的模式了,服务启动不起来。只能在服务的调用方式下带参数,然后在Main的参数中判断是否为服务方式。这在一般的情况下是可以解决问题的。

          后来有好几个项目,使用了开源的Socket框架,框架本身是通过配置来启动服务的,这样,就没有经过用户的Main方法了,启动带参数的方法不行了,如果为了判断启动模式而加单独的配置,不是很好的做法,通过Program加全局标识是可以解决程序自身启动同框架启动的判断,但服务如果是通过自身的Main启动,又只能靠加参数的方法了,整个实现感觉都是有点别扭。

          在几次的服务程序开发中,遇到一个写文件的路径问题,即取路径总是不对,通过分析,Windows服务启动时的环境默认路径是从System32目录,可能是Windows服务的宿主程序是从这开始的吧,这就有了解决如何判断启动模式的方法了。主要是通过宿主程序是程序集所在的目录来判断。具体如下 :

      string curPath = System.Environment.CurrentDirectory;
      string basePath = Path.GetDirectoryName(System.AppDomain.CurrentDomain.BaseDirectory);
      bool isRunWinService = (curPath != basePath);

    如果两个路径不相同,我就认为是启动Windows服务了。我们只要在程序的开始做判断,这样Environment.CurrentDirectory的路径还是宿主程序,一般来说,开发人员很少去改动Environment.CurrentDirectory的。这样我们做好的Exe程序支持用户启动,服务启动,或框架自动的服务管理等模式了。

  • 相关阅读:
    头像上传ASP.NET MVC实现-可拖动大小实时预览
    C#中将图片文件转化为二进制数组-用于数据库存储
    Sqlserver查询表结构信息-字段说明、类型、长度等信息
    Asp.Net MVC 页面代码压缩筛选器-自定义删除无效内容
    [LeetCode] 503. Next Greater Element II
    [LeetCode] 859. Buddy Strings
    [LeetCode] 27. Remove Element
    [LeetCode] 287. Find the Duplicate Number
    [LeetCode] 142. Linked List Cycle II
    [LeetCode] 791. Custom Sort String
  • 原文地址:https://www.cnblogs.com/Yjianyong/p/5560442.html
Copyright © 2011-2022 走看看