如何使用TopShelf无法识别的命令行参数

本文关键字:命令行 参数 识别 何使用 TopShelf | 更新日期: 2023-09-27 18:00:36

当我通过TopShelf将控制台应用程序作为Windows服务安装和启动时,我想将一些自定义参数传递给它。

当我使用:

MyService install start /fooBar: Test

控制台应用程序失败:

[失败]命令行找到未知的命令行选项:DEFINE:fooBar=测试

问题:

我如何让TopShelf能够识别我的论点,以便消费它们的价值观?

如何使用TopShelf无法识别的命令行参数

EDIT:这只在运行.exe时有效,而不是在作为服务运行时有效。作为一种替代方案,您可以将该选项添加为配置值,并在启动时读取它(无论如何,这可能是更好的做法):

using System.Configuration;
// snip
string foobar = null;
HostFactory.Run(configurator =>
{
    foobar = ConfigurationManager.AppSettings["foobar"];
    // do something with fooBar
    configurator.Service<ServiceClass>(settings =>
    {
        settings.ConstructUsing(s => GetInstance<ServiceClass>());
        settings.WhenStarted(s => s.Start());
        settings.WhenStopped(s => s.Stop());
    });
    configurator.RunAsLocalService();
    configurator.SetServiceName("ServiceName");
    configurator.SetDisplayName("DisplayName");
    configurator.SetDescription("Description");
    configurator.StartAutomatically();
});

根据文档,您需要指定以下模式中的命令:

-foobar:Test

您还需要在服务配置中添加定义:

string fooBar = null;
HostFactory.Run(configurator =>
{
    configurator.AddCommandLineDefinition("fooBar", f=> { fooBar = f; });
    configurator.ApplyCommandLine();
    // do something with fooBar
    configurator.Service<ServiceClass>(settings =>
    {
        settings.ConstructUsing(s => GetInstance<ServiceClass>());
        settings.WhenStarted(s => s.Start());
        settings.WhenStopped(s => s.Stop());
    });
    configurator.RunAsLocalService();
    configurator.SetServiceName("ServiceName");
    configurator.SetDisplayName("DisplayName");
    configurator.SetDescription("Description");
    configurator.StartAutomatically();
});