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

Установка приложения Topshelf в качестве службы Windows

Используя Visual Studio Express 2012, я создал консольное приложение с помощью Topshelf (версия 3.1.107.0). Приложение работает как консольное приложение, но я не могу понять, как его установить как службу. Я опубликовал проект из Visual Studio (Build, Publish), запустил командную строку в качестве администратора, перешел в папку, в которой было опубликовано приложение, и запустил setup.exe -install из командной строки. Приложение установлено и запускается, но как консольное приложение, а не служба Windows. Что мне здесь не хватает?

Для тех, кто не знаком с Topshelf, это платформа Windows Service для .Net и должна облегчить описанный выше сценарий - разработать и отладить как консольное приложение, развернув его как службу Windows. См. Документацию на http://docs.topshelf-project.com/en/latest/index.html.

4b9b3361

Ответ 2

  • Запустите Visual Studio и создайте новое консольное приложение С#
  • Щелкните правой кнопкой мыши по ссылкам и перейдите к управлению пакетами NuGet
  • Загрузите и установите Topshelf через NuGet
  • Вставьте код ниже в ваше приложение и включите весь импорт.
  • Переключиться из режима "Отладка" на "Отпустить" и создать приложение.
  • Запустите cmd.exe как администратор
  • Перейдите в консоль на

    .\myConsoleApplication\bin\Release\
    
  • Запустите команду

    .\myConsoleApplication.exe install
    
  • Запустите команду

    .\myConsoleApplication.exe start
    

код:

using System;
using System.Threading;
using Topshelf;
using Topshelf.Runtime;

namespace MyConsoleApplication
{
    public class MyService
    {
        public MyService(HostSettings settings)
        {
        }

        private SemaphoreSlim _semaphoreToRequestStop;
        private Thread _thread;

        public void Start()
        {
            _semaphoreToRequestStop = new SemaphoreSlim(0);
            _thread = new Thread(DoWork);
            _thread.Start();
        }

        public void Stop()
        {
            _semaphoreToRequestStop.Release();
            _thread.Join();
        }

        private void DoWork()
        {
            while (true)
            {
                Console.WriteLine("doing work..");
                if (_semaphoreToRequestStop.Wait(500))
                {
                    Console.WriteLine("Stopped");
                    break;
                }
            }
        }
    }

    public class Program
    {
        public static void Main()
        {

            HostFactory.Run(x =>                                 
            {
                x.StartAutomatically(); // Start the service automatically

                x.EnableServiceRecovery(rc =>
                {
                    rc.RestartService(1); // restart the service after 1 minute
                });


                x.Service<MyService>(s =>
                {
                    s.ConstructUsing(hostSettings => new MyService(hostSettings));
                    s.WhenStarted(tc => tc.Start());             
                    s.WhenStopped(tc => tc.Stop());               
                });
                x.RunAsLocalSystem();                            

                x.SetDescription("MyDescription");        
                x.SetDisplayName("MyDisplayName");                       
                x.SetServiceName("MyServiceName");    

            });                                                 
        }
    }
}

Ответ 3

Перейдите в папку и запустите команду:

AppName.exe install

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

Ответ 4

Итак, это старый вопрос, но я хочу добавить некоторые параметры командной строки.

MyTopShelfImplementation.exe install -servicename "MyServiceName" -displayname "My Display Name" --autostart start

.

- автозапуск

для перезагрузки Windows.

старт

для немедленного запуска службы.

Теперь, "имена" , которые вы также можете указать в коде

            HostFactory.Run(x =>
            {
                ////x.SetDescription("My Description");
                x.SetDisplayName("My Display Name");
                x.SetServiceName("My Service Name");
                ////x.SetInstanceName("My Instance");

Итак, если .exe работает как консольное приложение (или как служба Windows), может быть некоторая комбинация установки этих значений в коде и/или передачи их через командную строку.

Я бы ожидал, если бы вы не установили "имена" в коде И вы не передали "имена" в командной строке args, тогда вы получите поведение консоли.