当前位置:  开发笔记 > 开发工具 > 正文

检测代码是否作为服务运行

如何解决《检测代码是否作为服务运行》经验,为你挑选了2个好方法。

有没有办法让.NET库检测它是否作为服务运行?

我的图书馆可以以任何方式运行.但是当它作为服务运行时,开发人员需要调用另一个方法来指示事实或某些功能无法正常工作.我希望我的库处理日志记录,如果在没有调用该方法的服务中使用它,则会写一个警告.



1> Rob Parker..:

在通过intellisense,调试器和文档进行大量搜索之后,我们无法找到任何严格可靠的内容.有可能获得当前进程ID并尝试找出该进程是否已向SCM注册,但是当.NET提供了获取所有服务的集合的方法时,它们的进程ID不在可用信息中.可以将进程名称与服务名称进行比较,但不一定可靠.

但是,有两件事情相对容易检查,并且可能足以满足您的需要,如果不完全是"这段代码是作为服务运行的吗?"

System.Environment.UserInteractive:(正如斯蒂芬马丁所说)如果这是真的,它就不能成为一种服务.大多数不是服务(也不是设备驱动程序)的进程都会说真的.某些控制台应用程序在非交互式环境(例如构建过程的一部分)中运行时可能会说错误.

System.Diagnostics.Process.GetCurrentProcess().SessionId:(我认为这与皮埃尔所得的相同)如果不是0,则不是作为服务启动的.大多数正常的应用程序都不会在会话0中(如皮埃尔和斯蒂芬所指出的那样,有一些不那么正常的例外).最大的问题是如何在XP等旧版操作系统下运行.XP和Windows 2000显然在会话0中运行服务,但正常的应用程序也将在会话0中运行.XP的某些配置(例如,不在域中)允许同时进行多个用户会话,并且它们每个都获得不同的会话ID,但是第一个获得会话0.因此,在Vista之前检查不是那么有效.

因此,根据您实际需要区分的内容,这些检查中的一个或两个可能对您有用.


如果选中"允许服务与桌面交互"复选框,则"UserInteractive"属性将为"true".

2> Stephen Mart..:

虽然您可以使用Environment.UserInteractive进行猜测,但实际上没有任何方法可以判断您的库是否在服务的上下文中运行.

但通常,库不应该依赖于它的应用程序上下文.库应该为应用程序提供服务,如果它需要不同的参数,具体取决于它的调用方式,它应该要求应用程序提供这些参数.

您的库可能不会根据它是否托管在服务中而严格地采取不同的行为,而是有一些关于您的图书馆需要通知的服务环境或用户的信息.申请应告知图书馆必要的条件或信息,图书馆不应自行猜测.

编辑:如果可以,我会就你的问题发表评论.必要时使用重载方法和/或如果未提供所需的所有信息,则只是失败.

推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有