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