如何检测 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 中实例化的服务类中检查这一点,再一次,我可以在该类中引用什么作为 HostControl? 你做得太早了。 HostControl 在您的实际服务代码中。您提到的流畅的日程安排代码不应在 Topshelf 正在启动的服务之外创建。否则,它将开始安装、卸载和其他 Topshelf 命令。 克里斯,我觉得这根本不是“黑客”,而是简单明了。谢谢! 工作,我和@hlo 在一起——我的书里不是黑客! 这不能回答问题。它只是一段代码。叹息。【参考方案2】:

您可以使用 Environment.UserInteractive 。从技术上讲,这不会在 100% 的情况下起作用,因为可以在用户交互模式下运行服务,但这是一种边缘情况。

【讨论】:

【参考方案3】:

我总是为我的 Topshelf 服务设置服务名称、显示名称和服务描述。在服务的“属性”窗口的“可执行文件路径”中,您可以看到这些内容的命令行开关。换句话说:作为服务运行时,args 数组不会为空。

    if (args.Count() == 0 && Environment.UserInteractive)
    
        // Running in console mode
    

【讨论】:

以上是关于如何检测 Topshelf 是不是在控制台模式下运行的主要内容,如果未能解决你的问题,请参考以下文章

如何在安装后启动Topshelf服务?

C# Topshelf 超时异常

Topshelf的使用

使用Topshelf创建Windows服务

使用 Topshelf 创建 Windows 服务

topshelf windows服务