繁体   English   中英

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

[英]Installing a Topshelf application as a Windows service

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

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

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

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

            });                                                 
        }
    }
}

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

AppName.exe install

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

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

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

- 自动开启

适用于Windows重启的时间。

开始

用于安装后立即启动服务

现在,你也可以在代码中指定“名称”

            HostFactory.Run(x =>
            {
                ////x.SetDescription("My Description");
                x.SetDisplayName("My Display Name");
                x.SetServiceName("My Service Name");
                ////x.SetInstanceName("My Instance");

因此,如果.exe作为控制台应用程序(或作为Windows服务)运行,可能是在代码中设置这些值和/或通过命令行传递它们的某种组合。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM