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

时间:2013-08-13 10:30:41

标签: .net windows-services topshelf

使用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处的文档。

4 个答案:

答案 0 :(得分:71)

运行service.exe install以安装该服务。

有关详细信息,请参阅Topshelf Command Line Reference文档。

答案 1 :(得分:30)

  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
    
  10. 代码:

    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;在命令行参数中,您将获得控制台行为。