如何判断我在托管代码中编写的方法是从交互式应用程序还是从 Windows 服务调用的?
5 回答
您想了解 Windows 服务的哪一部分?或者您不想了解交互式应用程序的哪个部分?什么对你来说真正重要?
每当我听到这样的要求时,这几乎总是设计上的错误。我建议几个答案:
- 让调用者告诉你使用哪个格式化程序,或者
- 将格式化程序类的名称放入配置文件中。让所有格式化程序实现相同的接口。在运行时,第一次需要格式化程序时,创建配置文件中指定的格式化程序的实例,并通过公共接口调用它。
- 不要重新发明轮子。使用 System.Diagnostics 中的类,事实上,它的配置很像我的 #2。
代码对调用它的上下文敏感几乎总是一个错误。
我想我可能已经弄清楚了(至少这可以满足我的需要——你的里程可能会因你想要做的事情而有所不同)。有一个悬挂在 Environment 对象上的属性,称为“UserInteractive”。它会告诉您是否在可以访问桌面的上下文中运行。
至少有两种方法可以做到这一点:
- “System.Reflection.Assembly.GetCallingAssembly().FullName”将返回调用您的代码的程序集的名称。
- “Environment.StackTrace”将返回调用您的代码的完整堆栈跟踪。您应该在字符串中看到您的调用方法名称。
您可以定义两种不同的记录器:一种用于交互式应用程序,另一种用于 Windows 服务。并让客户使用配置文件选择他想使用的记录器。如果客户端选择了错误的记录器或忘记配置,您也可以使用默认记录器。我认为拥有可配置的日志记录和格式化消息等功能应该是一个更好的主意。
不知道是否有内置的可能性,但看看System.Diagnostics.Process
类。除其他外,它还有一种GetService()
方法,也许会对您有所帮助。如果失败,则有StartInfo
可能包含有用信息的成员。
如果不介意使用 PInvoke,可以获取当前进程的父进程。如果它在帐户NT AUTHORITY\SYSTEM下运行并且它的名称是service.exe,那么当前进程(很可能)是一个服务。