Windows和Linux上的Net Core Worker服务

8
这里是.Net Core Worker Service的上下文。我想在Windows操作系统上部署时将其运行为Windows服务,在Linux操作系统上则作为守护进程运行。但我只想保留一个二进制文件供Windows和Linux共同使用。
许多文章(包括这篇)都使用了UseWindowsService或UseSystemd,这意味着为了使此工作服务在Windows和Linux上运行,必须有两个不同的二进制文件。
由于我是DotNet Core的新手,我想学习/了解它是否可以根据操作系统条件地使用UseWindowsService/UseSystemd - 只保留一个二进制文件。

1
.NET Core不支持“一个二进制文件”(了解自包含部署的详细信息),因此如果您不能尽早适应它,那么您将会给自己带来麻烦。基于框架的部署可能允许您使用相同的二进制文件,但在不同的操作系统上安装不同版本的框架需要更多的工作。 - Lex Li
1个回答

11

正如@Lex Li所评论的那样,在.Net Core中不支持跨平台的单一二进制文件,实际上我从未遇到过任何能够做到这一点的本地二进制文件(因此HTML、JS、JAVA ".jar, .ear, .war"不计算在内)。

以下代码片段是创建守护程序和Windows服务的最小代码:

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureServices((hostContext, services) =>
        {
            services.AddHostedService<Worker>();
        })
    .UseWindowsService()
    .UseSystemd();
UseSystemd方法在非守护进程运行时将不会执行任何操作,因此您仍然可以正常运行和调试应用程序,或者在有或没有systemd的情况下在生产中使用它。 .UseWindowsService().UseSystemd()都是NOOP,因此它们只能在各自的环境中工作。因此,在Windows上,.UseSystemd()是无操作(什么也不做),而在Linux上,.UseWindowsService()是无操作(什么也不做)。
备注:构建自动化是流行软件用于构建跨平台二进制文件的常见方法。

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