使用Visual Studio Express 2012,我使用Topshelf(版本3.1.107.0)创建了一个控制台应用程序。该应用程序作为控制台应用程序,但我无法弄清楚如何将其作为服务安装。我从Visual Studio(Build,Publish)中发布了该项目,以管理员身份启动了命令提示符,导航到发布应用程序的文件夹,然后从命令提示符运行setup.exe -install。应用程序已安装并运行,但作为控制台应用程序,而不是Windows服务。我在这里缺少什么?
对于那些可能不熟悉Topshelf的人来说,它是.Net的Windows服务框架,应该促进我上面描述的场景 - 开发和调试作为控制台应用程序,部署为Windows服务。请参阅http://docs.topshelf-project.com/en/latest/index.html处的文档。
答案 0 :(得分:71)
运行service.exe install
以安装该服务。
有关详细信息,请参阅Topshelf Command Line Reference文档。
答案 1 :(得分:30)
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");
});
}
}
}
答案 2 :(得分:8)
浏览到该文件夹并运行命令:
AppName.exe install
您必须以管理员身份运行命令提示符。
答案 3 :(得分:3)
所以这是一个老问题,但我想添加一些命令行选项。
MyTopShelfImplementation.exe install -servicename&#34; MyServiceName&#34; -displayname&#34;我的显示名称&#34; --autostart start
- 自动起动
适用于Windows重新启动的时间。
启动
用于安装后立即启动服务
现在,&#34;名称&#34;你也可以在代码中指定
HostFactory.Run(x =>
{
////x.SetDescription("My Description");
x.SetDisplayName("My Display Name");
x.SetServiceName("My Service Name");
////x.SetInstanceName("My Instance");
因此,如果.exe作为控制台应用程序(或作为Windows服务)运行,可能是在代码中设置这些值和/或通过命令行传递它们的某种组合。
我希望如果你没有设置&#34;名称&#34;在代码中你没有传递&#34;名称&#34;在命令行参数中,您将获得控制台行为。