Topshelf和.NET Core在Linux下的应用

4

我有一个简单的应用程序,使用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
有人遇到过这个问题吗?我尝试谷歌搜索,但有人说它只适用于Windows,除此之外就无法使用了。或者,是否有其他适用于 .net core 的服务托管框架?请帮忙解决一下。

WojciechSzabowicz,您是否愿意接受@Paul-Sebastian Manole的答案呢?看起来这是您问题的正确答案,他花时间进行了解释。 - GrumpyRodriguez
2个回答

9

Topshelf 并未宣传其跨平台性,因此在非 Windows 环境下,官方并不支持 .Net Core(至少在撰写本文时如此)。但是,它可以在这些环境中运行(请参见下文)。

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

以下是我的项目示例。创建服务时,请根据主机操作系统在运行时选择 env 生成器。

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>();
});

我不确定我是否明白你的意思。这段代码似乎表明,如果Topshelf服务没有在Windows上运行,它会拒绝启动。你是说你已经成功地在Linux上运行了Topshelf服务吗? - InteXX
@InteXX,是的。这就是我展示的。 - Paul-Sebastian Manole
这是非常好的消息(至少对我来说是这样)。我无法用言语来形容这个消息有多好 :-) - InteXX

4
假设您已经安装了 Topshelf 的 此版本,您会注意到在依赖项中它不支持 .NET Core,因此它不能在 Linux 环境下运行。
正如您在帖子中提到的那样,它只能在 Windows 环境下运行。kernel32.dll 是一个 Windows 依赖项,它找不到它,因此无法运行。

3
是的,它是版本4.2.0,但通过主机工厂的API,我发现了UseEnvironmentBuilder方法(好像官方文档中没有描述这个方法,就好像它不存在一样)。在描述中,它说默认值是WindowsHostEnvironmentBuilder,当我将其更改为DotNetCoreEnvironmentBuilder时,它在Linux上运行正常。 - Wojciech Szabowicz
@WojciechSzabowicz — 这非常有趣!我想Topshelf的install CLI参数可能不起作用(我在源代码中发现了一些仅适用于Windows的代码——示例)。你也是这样发现的吗? - InteXX

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接