Установка консольного приложения в качестве службы Windows - PullRequest
2 голосов
/ 28 марта 2011

Я пишу простую службу Windows, основанную на TopShelf . Как установить мое приложение как сервис? Я пытался выполнить SpyService.exe install, но это не сработало.

В чем разница между следующими двумя способами настройки службы?

var cfg = RunnerConfigurator.New(
    x =>
    {
        x.ConfigureService<SpyService>(s =>
        {
            s.Named("SpyService");
            s.HowToBuildService(name => new SpyService());
            s.WhenStarted(tc => { 
                XmlConfigurator.ConfigureAndWatch(new FileInfo(".\\log4net.config")); 
                tc.Start(); });
            s.WhenStopped(tc => tc.Stop());
        });
        x.RunAsFromInteractive();

        x.SetDescription("Сервис логирования действий пользователя.");
        x.SetDisplayName("SpyService");
        x.SetServiceName("SpyService");
    });

Runner.Host(cfg, args);

и

var host = HostFactory.New(x =>
{                
    x.Service<SpyService>(s =>
    {
        s.SetServiceName("SpyService");
        s.ConstructUsing(name => new SpyService());
        s.WhenStarted(service =>
        {
            XmlConfigurator.ConfigureAndWatch(new FileInfo(".\\log4net.config"));
            service.Start();
        });
        s.WhenStopped(service => service.Stop());
    });

    x.RunAsLocalSystem();
    x.SetDescription("Сервис логирования действий пользователя.");
    x.SetDisplayName("SpyService");
    x.SetServiceName("SpyService");
});

host.Run();

Я заметил, что если я использую второй метод, служба успешно установлена, но невозможно запустить службу с x.RunAsFromInteractive(), как при первом способе.

Ответы [ 3 ]

1 голос
/ 28 марта 2011

Какую версию Topshelf вы используете?Старый синтаксис был SpyService.exe service install, но был упрощен.

0 голосов
/ 23 марта 2013

Вы можете сначала запустить консольную команду от имени администратора, а затем выполнить команду установки

0 голосов
/ 07 апреля 2011

Первый подход устарел в последней версии (2.2), afaik.

Относительно RunAsFromInteractive (), глядя на исходный код верхнего полка, я вижу, что он называется RunAs () с пустым именем пользователя / паролем:

public void RunAsFromInteractive()
{
    this.RunAs("", "");
}
...