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


70

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

对于可能不熟悉Topshelf的用户来说,它是.Net的Windows Service框架,可以简化我在上面描述的场景-作为控制台应用程序进行开发和调试,作为Windows Service进行部署。请参阅http://docs.topshelf-project.com/en/latest/index.html上的文档。


8
我看过“从可执行文件创建Windows服务”问题。它似乎与我的问题无关,因为它与Topshelf无关。
布伦丹·雷诺兹

2
是的,这就是Topshelf所做的,是的,我已经研究了他们的文档。
布伦丹·雷诺兹

那么你发现了什么?显然,您似乎在遵循他们的文档时遇到了麻烦,尤其是在“该应用程序已安装并运行,但作为控制台应用程序而非Windows服务”处。您是否在Windows的“服务MMC”管理单元中看到安装的服务?
CodeCaster

2
据我从文档(docs.topshelf-project.com/en/latest/index.html所知,我正在做我应该做的事情。但是由于它对我不起作用-但从我的搜索来看,似乎正在为其他人工作-大概是我在忽略一些东西。否,该应用程序不会出现在Windows Services MMC管理单元中。
布伦丹·雷诺兹

Answers:


85

运行您service.exe install的服务。

有关更多信息,请参见《Topshelf命令行参考》文档。


1
谢谢!我的错误是,当我应该在bin \ release文件夹中安装servicename.exe文件时,我试图安装发布该应用程序时创建的setup.exe!h!现在都在工作。
布伦丹·雷诺兹

没有程序本身中的某种代码来处理安装,这将无法执行任何操作。
computercarguy19年

@Travis您可以检查我的最新问题吗,我在安装Topshelf时遇到问题。非常感谢队友
Roxy'Pro

34
  1. 启动Visual Studio并创建一个新的C#控制台应用程序
  2. 右键单击参考并去管理NuGet-Packages
  3. 通过NuGet下载并安装Topshelf
  4. 将以下代码粘贴到您的应用程序中,并包括所有导入内容。
  5. 从“调试”模式切换到“发布”并构建应用程序。
  6. cmd.exe以管理员身份运行
  7. 浏览控制台至

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

    .\myConsoleApplication.exe install
    
  9. 运行命令

    .\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");    

            });                                                 
        }
    }
}

安装后我可以自动启动服务吗?
MRID

7

浏览到该文件夹​​并运行命令:

AppName.exe install

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


没有程序本身中的某种代码来处理安装,这将无法执行任何操作。
computercarguy19年

3

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

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

- 自动开启

用于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传递“名称”,那么您将获得控制台行为。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.