如何将 topshelf 集成到现有的 windows 服务项目中?

How to integrate topshelf to an existing windows service project?

我希望能够在 Visual Studio 中使用我的服务的 TopShelf 调试功能。

很多 examples and documentation 提到在 Visual Studio first 和 [=20= 中创建一个 Windows 控制台项目]然后 添加 TopShelf、OWIN 等

然而,在我的例子中,我已经有一个非常好的和工作的 Windows 服务项目,叫做 QShipsService.sln,等等......它使用一个简单的连接服务(无可否认,旧的 SOAP 遗留服务).

有人可以指导我或提供如何使用 TopShelf 的示例,以及现有的 非控制台 之类的项目吗?

我找到了自己的解决方案...

我所做的假设是默认 Windows 服务项目默认要将程序注册为服务并启动 OnOpen()OnClose() 方法,一旦服务是运行.

在我的例子中,我想重新使用基于 Timer() 的现有服务,它每 4 小时启动一次以调用 SOAP 调用和 return 一些数据。我没有意识到的是 ServiceConfigurator 试图调用它自己的 Open()Close() 方法。

所以我注释掉了 OnOpenOnClose 方法,并允许配置器通过 Open() 方法调用我的工作进程,这就是我本来要做的第一次!

对于像我这样的菜鸟,这里是代码...

//using System.ServiceProcess;
using Topshelf;

namespace QShipsService
{
    static class Program
    {
        static void Main(string[] args)
        {
            HostFactory.Run(
                configure =>
                {
                    configure.Service<QShipsService.QshipsService>(
                        service =>
                        {
                            service.ConstructUsing(s => new QShipsService.QshipsService());
                            service.WhenStarted(s => s.QStart());
                            service.WhenStopped(s => s.QStop());
                        });

                    //Setup Account that window service use to run.
                    configure.RunAsLocalSystem();

                    //add details and names about the service
                    configure.SetServiceName("QshipsService");
                    configure.SetDisplayName("QshipsService");
                    configure.SetDescription("QshipsService Windows Service to extract data from the QSHIPS SOAP service. Data is recorded and maintained inside the SPOT's database in POT-DB.");
                });


            //## USE THIS IF WE'RE NOT USING TOPSHELF !! ##
            //    //this loads and starts the QshipsService (see QshipsService.cs program)
            //    ServiceBase[] ServicesToRun;
            //    ServicesToRun = new ServiceBase[]
            //    {
            //        new QShipsService.QshipsService()
            //    };
            //    ServiceBase.Run(ServicesToRun);
        }
    }
}