将控制台应用程序安装为Windows服务

时间:2011-03-27 21:33:56

标签: .net windows-services installation topshelf

我正在编写一个基于TopShelf的简单Windows服务。如何将我的应用程序安装为服务?我试图执行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 个答案:

答案 0 :(得分:1)

您使用的是什么版本的Topshelf?旧语法为SpyService.exe service install,但已经过简化。

答案 1 :(得分:0)

第一种方法在最新版本(2.2)中已经废弃。

关于RunAsFromInteractive(),查看topshelf源代码,我看到它调用带有空用户名/密码的RunAs():

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

答案 2 :(得分:0)

您可以先以管理员身份运行Console命令,然后运行安装命令