在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程序支持用户启动,服务启动,或框架自动的服务管理等模式了。

最新文章

  1. 腾讯云 安装mono
  2. 【AngularJS】—— 13 服务Service
  3. Unity中通过类名字符串取组件类型的方法(Types.GetType用法)
  4. CSS选择符详解之关系选择符篇
  5. Android App性能测试之二:CPU、流量
  6. 常见的爬虫分析库(1)-Python3中Urllib库基本使用
  7. 一个小demo 实用selenium 抓取淘宝搜索页面内的产品内容
  8. BZOJ3425[POI2013]Polarization——DP+bitset+分块
  9. Spring 系列教程之 bean 的加载
  10. 银行卡号码校验算法(Luhn算法,又叫模10算法)
  11. Silverlight 5 Developer Rumtime
  12. Eclipse编辑jsp不显示预览效果页面
  13. [转]托管DirectX,从MDX到SlimDX的转换
  14. Python 入门之基本数据类型
  15. Linux服务器使用tar加密压缩文件
  16. P/Invoke 光标的操作
  17. 【云计算】k8s相关资料
  18. lintcode-110-最小路径和
  19. 利用 spring 的 task:scheduled-tasks 执行定期任务
  20. 本地上jar命令

热门文章

  1. iOS:实现MKAnnotation协议,在地图上设置大头针,点击显示具体的位置信息
  2. Elsevier 投稿各种状态总结
  3. post提交/文件上传服务器修改
  4. USACO Section 2.3: Controlling Companies
  5. Eclipse 下如何引用另一个项目的Java文件
  6. MyEclipse 10离线安装PyDev插件
  7. leetcode:Summary Ranges
  8. C#判断字符串为空的几种方法和效率判断
  9. hdfs工作原理
  10. asp.net限时发送手机验证码