linux 下的 Topshelf 和 .net 核心

Topshelf and .net core under linux

我有一个简单的应用程序,它使用 topshelf 作为服务启动,看起来很简单:

 HostFactory.Run(x =>
 {
    x.Service<RequestService>();
    x.RunAsLocalSystem();
 });

很好用,但在 windows 下。当我在 Linux 下尝试这个时,我得到:

Topshelf.Runtime.Windows.WindowsHostEnvironment Error: 0 : Unable to get parent process (ignored), System.DllNotFoundException: Unable to load shared library 'kernel32.dll' or one of its dependencies. In order to help diagnose loading problems, consider setting the LD_DEBUG environment variable: libkernel32.dll: cannot open shared object file: No such file or directory

有人遇到过这个问题吗? 我尝试 google 它,但有人说它可以工作,但它只是 windows.

的工具

或者.net core有其他的服务提升框架吗?

假设您安装了 this 版本的 Topshelf - 您会注意到它不支持 .NET Core 的依赖关系,因此它不会 运行 在 Linux 环境下.

它只会 运行 在 Windows 环境下,正如您在 post 中提到的那样。 kernel32.dll 是它找不到的 Windows 依赖项,因此它不能 运行。

Topshelf 不是 cross-platform,因此它在 non-Windows 环境中不支持 .Net Core,即使它可以 运行 在其中(至少在撰写本文时) .

解决方案是更改环境生成器。 这是创建服务时我项目中的一个示例:

HostFactory.Run(c =>
{
  // Change Topshelf's environment builder on non-Windows hosts:
  if (
    RuntimeInformation.IsOSPlatform(OSPlatform.OSX) ||
    RuntimeInformation.IsOSPlatform(OSPlatform.Linux)
  )
  {
    c.UseEnvironmentBuilder(
      target => new DotNetCoreEnvironmentBuilder(target)
    );
  }

  c.SetServiceName("SelloutReportingService");
  c.SetDisplayName("Sellout Reporting Service");
  c.SetDescription(
    "A reporting service that does something...");
  c.StartAutomatically();
  c.RunAsNetworkService();
  c.EnableServiceRecovery(
    a => a.RestartService(TimeSpan.FromSeconds(60))
  );
  c.StartAutomatically();
  c.Service<SelloutReportingService>();
});