如何在控制台模式下检测 Topshelf 是否为 运行
How to detect if Topshelf is running in console mode
我将 Topshelf 与 FluentSchedule 结合用于 Windows 服务。
但是,我希望能够试用-运行应用程序简单地启动而不执行设置计时器等的 FluentSchedule 代码
当从命令行 运行 运行 exe 文件时(即没有 'install' 命令)有没有办法从 TopShelf 检查它是 运行 在控制台模式下运行?
这有点 hack,但您可以尝试将 HostControl
界面转换为 ConsoleRunHost
,如果是那种类型,您就是 运行 作为控制台应用程序。
当然,这并不理想,但您肯定可以将其隐藏在扩展方法中以使其不那么难看。
public static bool IsRunningAsConsole(this HostControl control)
{
return control is ConsoleRunHost;
}
然后您可以通过调用服务配置中的 WhenStarted() 传入 HostControl 来访问它。
s.WhenStarted((tc, hostControl) => tc.Start(hostControl));
您可以使用 Environment.UserInteractive
。从技术上讲,这在 100% 的情况下都不起作用,因为可以 运行 用户交互模式下的服务,但这是边缘情况。
我总是为我的 Topshelf 服务设置服务名称、显示名称和服务描述。在服务属性 window 的“可执行文件路径”中,您可以看到这些东西的命令行开关。也就是说:当运行作为服务时,args数组不会为空。
if (args.Count() == 0 && Environment.UserInteractive)
{
// Running in console mode
}
我将 Topshelf 与 FluentSchedule 结合用于 Windows 服务。
但是,我希望能够试用-运行应用程序简单地启动而不执行设置计时器等的 FluentSchedule 代码
当从命令行 运行 运行 exe 文件时(即没有 'install' 命令)有没有办法从 TopShelf 检查它是 运行 在控制台模式下运行?
这有点 hack,但您可以尝试将 HostControl
界面转换为 ConsoleRunHost
,如果是那种类型,您就是 运行 作为控制台应用程序。
当然,这并不理想,但您肯定可以将其隐藏在扩展方法中以使其不那么难看。
public static bool IsRunningAsConsole(this HostControl control)
{
return control is ConsoleRunHost;
}
然后您可以通过调用服务配置中的 WhenStarted() 传入 HostControl 来访问它。
s.WhenStarted((tc, hostControl) => tc.Start(hostControl));
您可以使用 Environment.UserInteractive
。从技术上讲,这在 100% 的情况下都不起作用,因为可以 运行 用户交互模式下的服务,但这是边缘情况。
我总是为我的 Topshelf 服务设置服务名称、显示名称和服务描述。在服务属性 window 的“可执行文件路径”中,您可以看到这些东西的命令行开关。也就是说:当运行作为服务时,args数组不会为空。
if (args.Count() == 0 && Environment.UserInteractive)
{
// Running in console mode
}