如何检测 Topshelf 是不是在控制台模式下运行
Posted
技术标签:
【中文标题】如何检测 Topshelf 是不是在控制台模式下运行【英文标题】:How to detect if Topshelf is running in console mode如何检测 Topshelf 是否在控制台模式下运行 【发布时间】:2015-02-26 11:00:35 【问题描述】:我将 Topshelf 与 FluentSchedule 结合用于 Windows 服务。
但是,我希望能够试运行应用程序以简单地启动而不执行设置计时器等的 FluentSchedule 代码。
从命令行运行 exe 文件时(即没有“安装”命令)有没有办法从 TopShelf 检查它是否在控制台模式下运行?
【问题讨论】:
如果您还没有,我会在邮件列表中询问groups.google.com/forum/#!members/topshelf-discuss。我认为没有明显的方法。你也可以在 GitHub 上打开一个问题:github.com/topshelf/topshelf 与TopShelf没有直接关系,不过可以看看***.com/questions/2397162/… 【参考方案1】:这有点像 hack,但您可以尝试将HostControl
接口转换为ConsoleRunHost
,如果是这种类型,您将作为控制台应用程序运行。
当然,这并不理想,但您当然可以将其隐藏在扩展方法中以使其不那么难看。
public static bool IsRunningAsConsole(this HostControl control)
return control is ConsoleRunHost;
然后,您可以通过调用服务配置中的 WhenStarted() 来访问 HostControl。
s.WhenStarted((tc, hostControl) => tc.Start(hostControl));
【讨论】:
我很难确定在运行时将什么以及何时引用为 HostControl。在调用 HostFactory.Run(x => etc.) 之前我可以参考什么,这将是一个 HostControl?还是我做得太早了?我是否应该在我在 x.Service您可以使用 Environment.UserInteractive
。从技术上讲,这不会在 100% 的情况下起作用,因为可以在用户交互模式下运行服务,但这是一种边缘情况。
【讨论】:
【参考方案3】:我总是为我的 Topshelf 服务设置服务名称、显示名称和服务描述。在服务的“属性”窗口的“可执行文件路径”中,您可以看到这些内容的命令行开关。换句话说:作为服务运行时,args 数组不会为空。
if (args.Count() == 0 && Environment.UserInteractive)
// Running in console mode
【讨论】:
以上是关于如何检测 Topshelf 是不是在控制台模式下运行的主要内容,如果未能解决你的问题,请参考以下文章