Подтвердить что ты не робот

Как использовать аргументы CommandLine, которые не распознаются TopShelf?

Я хочу передать некоторые пользовательские аргументы в консольное приложение при установке и запустить его как службу Windows через TopShelf.

Когда я использую:

MyService install start /fooBar: Test

Не удается выполнить консольное приложение:

[Сбой] Командная строка Найдена неизвестная опция командной строки: DEFINE: fooBar = Test

Вопрос:

Как заставить мои аргументы распознавать TopShelf, чтобы я мог использовать их значения?

4b9b3361

Ответ 1

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();
});