Linux下的Topshelf和.net core

Woj*_*icz 4 c# topshelf

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

 HostFactory.Run(x =>
 {
    x.Service<RequestService>();
    x.RunAsLocalSystem();
 });
Run Code Online (Sandbox Code Playgroud)

嗯,它可以工作,但是在 Windows 下。当我在 Linux 下尝试这个时,我得到:

Topshelf.Runtime.Windows.WindowsHostEnvironment 错误:0:无法获取父进程(忽略),System.DllNotFoundException:无法加载共享库“kernel32.dll”或其依赖项之一。为了帮助诊断加载问题,请考虑设置 LD_DEBUG 环境变量:libkernel32.dll:无法打开共享对象文件:没有这样的文件或目录

有人遇到过这个问题吗?我试图用谷歌搜索它,但有人说它有效,但它只是适用于 Windows 的工具。

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

Pau*_*ole 9

Topshelf 并未宣传为跨平台,因此它没有(或在撰写本文时没有)在非 Windows 环境中正式支持 .Net Core,即使它可以在其中运行(至少在撰写本文时,见下文)。

解决方案是在非 Windows 主机上运行时更改环境构建器。

这是我的项目的一个例子。创建服务时,根据主机操作系统在运行时选择环境构建器。

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>();
});
Run Code Online (Sandbox Code Playgroud)