Ответ 1
Запустите service.exe install
, чтобы установить службу.
Дополнительную информацию см. в документации Справочник по командной строке Topshelf.
Используя 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.
Запустите service.exe install
, чтобы установить службу.
Дополнительную информацию см. в документации Справочник по командной строке Topshelf.
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");
});
}
}
}
Перейдите в папку и запустите команду:
AppName.exe install
Вы должны запустить свою командную строку в качестве администратора.
Итак, это старый вопрос, но я хочу добавить некоторые параметры командной строки.
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, тогда вы получите поведение консоли.