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);string

若是两个路径不相同,我就认为是启动Windows服务了。咱们只要在程序的开始作判断,这样Environment.CurrentDirectory的路径仍是宿主程序,通常来讲,开发人员不多去改动Environment.CurrentDirectory的。这样咱们作好的Exe程序支持用户启动,服务启动,或框架自动的服务管理等模式了。配置

相关文章
相关标签/搜索