23

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

当我使用:

MyService install start /fooBar: Test

控制台应用程序失败:

[失败] 命令行 发现未知的命令行选项:DEFINE: fooBar = Test

问题:

我怎样才能让我的论点被 TopShelf 识别,以便我可以使用它们的值?

4

1 回答 1

38

编辑:这仅在运行 .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();
});
于 2013-06-18T17:27:08.573 回答