.net 将Topshelf应用程序作为Windows服务安装

.net 将Topshelf应用程序作为Windows服务安装,.net,windows-services,topshelf,.net,Windows Services,Topshelf,使用Visual Studio Express 2012,我使用Topshelf(版本3.1.107.0)创建了一个控制台应用程序。该应用程序作为控制台应用程序工作,但我不知道如何将其作为服务安装。我已从Visual Studio(Build,Publish)中发布了项目,以管理员身份启动了命令提示符,导航到发布应用程序的文件夹,并从命令提示符下运行setup.exe-install。应用程序已安装并运行,但作为控制台应用程序,而不是Windows服务。我错过了什么 对于那些可能不熟悉Topsh

使用Visual Studio Express 2012,我使用Topshelf(版本3.1.107.0)创建了一个控制台应用程序。该应用程序作为控制台应用程序工作,但我不知道如何将其作为服务安装。我已从Visual Studio(Build,Publish)中发布了项目,以管理员身份启动了命令提示符,导航到发布应用程序的文件夹,并从命令提示符下运行setup.exe-install。应用程序已安装并运行,但作为控制台应用程序,而不是Windows服务。我错过了什么


对于那些可能不熟悉Topshelf的人来说,它是一个针对.Net的Windows服务框架,应该可以促进我上面描述的场景—作为控制台应用程序开发和调试,作为Windows服务部署。请参阅上的文档

运行
service.exe安装程序
安装服务

有关更多信息,请参阅文档

  • 启动Visual Studio并创建一个新的C#控制台应用程序
  • 右键单击引用并转到管理NuGet包
  • 通过NuGet下载并安装Topshelf
  • 将下面的代码粘贴到应用程序中,并包括所有导入
  • 从“调试”模式切换到“发布”,并构建应用程序
  • 以管理员身份运行
    cmd.exe
  • 将控制台导航到

    .\myConsoleApplication\bin\Release\
    
  • 运行命令

    .\myConsoleApplication.exe install
    
    .\myConsoleApplication.exe start
    
  • 运行命令

    .\myConsoleApplication.exe install
    
    .\myConsoleApplication.exe start
    
  • 代码:

    使用系统;
    使用系统线程;
    使用Topshelf;
    使用Topshelf.Runtime;
    命名空间MyConsoleApplication
    {
    公共类MyService
    {
    公共MyService(主机设置)
    {
    }
    私有信号量limu信号量请求停止;
    私有线程(u线程),;
    公开作废开始()
    {
    _semaphoreToRequestStop=新信号量lim(0);
    _螺纹=新螺纹(销钉);
    _thread.Start();
    }
    公共停车场()
    {
    _semaphoreToRequestStop.Release();
    _thread.Join();
    }
    私房
    {
    while(true)
    {
    Console.WriteLine(“做工作”);
    if(_信号量torequeststop.Wait(500))
    {
    控制台。写入线(“停止”);
    打破
    }
    }
    }
    }
    公共课程
    {
    公共静态void Main()
    {
    HostFactory.Run(x=>
    {
    x、 StartAutomatically();//自动启动服务
    x、 启用ServiceRecovery(rc=>
    {
    rc.RestartService(1);//1分钟后重新启动服务
    });
    x、 服务(s=>
    {
    s、 ConstructUsing(hostSettings=>newmyservice(hostSettings));
    s、 开始时(tc=>tc.Start());
    s、 停止时(tc=>tc.Stop());
    });
    x、 RunAsLocalSystem();
    x、 SetDescription(“MyDescription”);
    x、 SetDisplayName(“MyDisplayName”);
    x、 SetServiceName(“MyServiceName”);
    });                                                 
    }
    }
    }
    
    浏览到文件夹并运行命令:

    AppName.exe install
    

    您必须以管理员身份运行命令提示符

    这是一个老问题,但我想添加一些命令行选项

    MyTopShelfImplementation.exe安装-servicename“MyServiceName” -displayname“我的显示名”--自动启动

    --自动启动

    用于windows重新启动时

    开始

    用于在安装后立即启动服务

    现在,您还可以在代码中指定“名称”

                HostFactory.Run(x =>
                {
                    ////x.SetDescription("My Description");
                    x.SetDisplayName("My Display Name");
                    x.SetServiceName("My Service Name");
                    ////x.SetInstanceName("My Instance");
    
    因此,如果.exe作为控制台应用程序(或windows服务)运行,则可能是在代码中设置这些值和/或通过命令行传递这些值的组合


    如果您没有在代码中设置“名称”,并且没有通过命令行参数传递“名称”,那么您将获得控制台行为。

    我已经查看了“从可执行文件创建Windows服务”问题。这似乎与我的问题无关,因为它与Topshelf无关。是的,Topshelf就是这么做的,是的,我研究了他们的文档。那么你发现了什么?显然,您在遵循他们的文档时遇到了问题,尤其是“应用程序已安装并运行,但作为控制台应用程序,而不是Windows服务”。你看到Windows服务MMC管理单元中安装的服务了吗?从文档()中我可以看出,我正在做我应该做的事情。但由于它对我不起作用——但从我的搜索结果来看,似乎是在为别人工作——我大概忽略了什么。不,该应用程序不会出现在Windows服务MMC管理单元中。谢谢!我的错误是,我试图安装发布应用程序时创建的setup.exe,而我本应在bin\release文件夹中安装servicename.exe文件!啊!现在一切正常。如果程序本身没有某种代码来处理安装,这一切都不会发生。@Travis你能检查我的最新问题吗?我对Topshelf的安装有问题。非常感谢,如果程序本身没有某种代码来处理安装,这一切都不会发生。我可以在安装后自动启动服务吗?