【问题标题】:Installing a Topshelf application as a Windows service将 Topshelf 应用程序安装为 Windows 服务
【发布时间】:2013-08-14 22:19:32
【问题描述】:

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

对于那些可能不熟悉 Topshelf 的人来说,它是一个适用于 .Net 的 Windows 服务框架,应该有助于我上面描述的场景 - 作为控制台应用程序开发和调试,作为 Windows 服务部署。请参阅http://docs.topshelf-project.com/en/latest/index.html 的文档。

【问题讨论】:

  • 我查看了“从可执行文件创建 Windows 服务”问题。它似乎与我的问题无关,因为它与 Topshelf 无关。
  • 是的,Topshelf 就是这样做的,是的,我研究了他们的文档。
  • 那么你发现了什么?显然,您似乎无法遵循他们的文档,尤其是在 “应用程序已安装并运行,但作为控制台应用程序,而不是 Windows 服务”。您是否看到安装在 Windows 的服务 MMC 管理单元中的服务?
  • 据我从文档 (docs.topshelf-project.com/en/latest/index.html) 中得知,我正在做我应该做的事情。但由于它对我不起作用——但从我的搜索来看,似乎是在为他人工作——大概我忽略了一些东西。不,该应用程序不会出现在 Windows 服务 MMC 管理单元中。

标签: .net windows-services topshelf


【解决方案1】:

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

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

【讨论】:

  • 谢谢!我的错误是我试图安装发布应用程序时创建的 setup.exe,而我应该在 bin\release 文件夹中安装 servicename.exe 文件!嗬!现在一切正常。
  • 如果程序本身没有某种代码来处理安装,这将无济于事。
  • @Travis 你能检查我的最新问题吗?我在安装 Topshelf 时遇到问题。非常感谢朋友
【解决方案2】:
  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");    

            });                                                 
        }
    }
}

【讨论】:

【解决方案3】:

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

AppName.exe install

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

【讨论】:

  • 如果程序本身没有某种代码来处理安装,这将无济于事。
【解决方案4】:

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

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 服务)运行,则可能是在代码中设置这些值和/或通过命令行传递它们的某种组合。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多