74

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

4

4 回答 4

89

运行你service.exe install的安装服务。

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

于 2013-08-13T11:43:41.983 回答
36
  1. 启动 Visual Studio 并创建一个新的 C# Console-Application
  2. 右键单击引用并转到管理 NuGet-Packages
  3. 通过 NuGet 下载并安装 Topshelf
  4. 将下面的代码粘贴到您的应用程序中并包含所有导入。
  5. 从“Debug”模式切换到“Release”并构建应用程序。
  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");    

            });                                                 
        }
    }
}
于 2016-03-29T12:12:42.300 回答
8

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

AppName.exe install

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

于 2016-05-10T08:53:47.483 回答
3

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

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

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

于 2017-11-01T20:07:21.637 回答