【发布时间】:2009-05-26 18:00:03
【问题描述】:
如何判断我在托管代码中编写的方法是从交互式应用程序还是从 Windows 服务调用的?
【问题讨论】:
如何判断我在托管代码中编写的方法是从交互式应用程序还是从 Windows 服务调用的?
【问题讨论】:
您想了解 Windows 服务的哪一部分?或者您不想了解交互式应用程序的哪个部分?什么对你来说真正重要?
每当我听到这样的请求时,几乎都是设计上的错误。我建议几个答案:
代码对调用它的上下文敏感几乎总是一个错误。
【讨论】:
我想我可能已经弄清楚了(至少这可以满足我的需要——您的里程可能会因您尝试做的事情而有所不同)。有一个悬挂在 Environment 对象上的属性,称为“UserInteractive”。它会告诉您是否在可以访问桌面的上下文中运行。
【讨论】:
至少有两种方法可以做到这一点:
【讨论】:
您可以定义两种不同的记录器:一种用于交互式应用程序,另一种用于 Windows 服务。并让客户使用配置文件选择他想使用的记录器。如果客户端选择了错误的记录器或忘记配置,您也可以使用默认记录器。 我认为将日志记录和格式化消息等功能设置为可配置应该是一个更好的主意。
【讨论】:
不知道是否有内置的可能性,但请查看 System.Diagnostics.Process 类。除其他外,它还有一个GetService() 方法,也许这会对您有所帮助。如果失败,StartInfo 成员可能包含有用的信息。
如果不介意使用PInvoke,可以获取当前进程的父进程。如果它在 NT AUTHORITY\SYSTEM 帐户下运行并且它的名称是 service.exe,那么当前进程(很可能)是一个服务。
【讨论】: