我有一个C#/.NET程序,既可以作为控制台应用程序运行,也可以作为服务运行。目前,我为它提供了一个命令行选项,以作为控制台应用程序启动,但我希望避免这种情况。
是否可以通过编程方式检测我的程序是否正在作为服务启动?
如果它是纯Win32,我可以尝试使用StartServiceCtrlDispatcher作为服务启动,如果它返回ERROR_FAILED_SERVICE_CONTROLLER_CONNECT,则返回控制台,但如果失败,System.ServiceProcess.ServiceBase.Run()将弹出一个错误对话框,然后返回,而不向程序发出错误信号。
有什么想法吗?
发布于 2008-10-16 09:47:19
拉斯穆斯,this is the earlier question。
从答案上看,似乎最流行的方法是使用简单的命令行选项,或者尝试访问try catch块中的Console对象(在Service中,Console不附加到进程,并且尝试访问它会抛出异常)。
或者,如果您在测试/调试服务时遇到问题,可以将代码移动到一个单独的dll程序集中,并创建一个单独的测试工具(winforms/console等)。
(刚刚注意到Jonathan在问题的末尾添加了他的解决方案。)
发布于 2010-02-18 18:39:31
Environment.UserInteractive会施展魔法的。
发布于 2014-10-15 03:04:26
可能需要尝试Process对象的SessionId属性。根据我的经验,如果进程正在运行服务,则将SessionId设置为0。
https://stackoverflow.com/questions/207896
复制相似问题