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