如何从.Net Core 3创建Windows服务[关闭]

2024-02-03

最近我需要将.Net Core 3.0控制台应用程序转换为Windows服务。

由于我不需要将此流程移植到 Linux,因此我可以放弃在 Stackoverflow 上看到的处理 .Net Framework、.Net Standard 和 .Net Core 任意组合的多平台解决方案。

编辑:Visual Studio 2019 即将推出一个工作模板。由于它是预发布的,因此会存在一些潜在的稳定性问题。我无法获得工作参考之一,因此我在下面提出的解决方案应该足够了,直到模板稳定为止。 (看https://devblogs.microsoft.com/aspnet/net-core-workers-as-windows-services/ https://devblogs.microsoft.com/aspnet/net-core-workers-as-windows-services/)


  • 首先在 Visual Studio 2019 中创建一个 .Net Core 控制台应用程序。使用前需要安装 .Net Core 3 SDK。还要确保您可以通过在“工具”->“选项”->“预览功能”“使用 .NET Core SDK 的预览”中指定设置来引用 .Net Core 3 预览版
  • 将语言版本至少设置为 7.1 以支持 Main 方法的异步任务。 (从项目设置->构建->高级->语言设置访问语言版本)。 .Net Core 3 和 Visual Studio 2019 支持 C# 8.0
  • 添加 Microsoft.Extensions.Hosting 和 System.ServiceProcess.ServiceController 包。

现在转到 Program.cs 并复制以下内容:

using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace AdvancedHost
{
    internal class Program
    {
        private static async Task Main(string[] args)
        {
            var isService = !(Debugger.IsAttached || args.Contains("--console"));

            var builder = new HostBuilder()
                .ConfigureServices((hostContext, services) =>
                {
                    services.AddHostedService<LoggingService>();
                });

            if (isService)
            {
                await builder.RunAsServiceAsync();
            }
            else
            {
                await builder.RunConsoleAsync();
            }
        }
    }
}

此代码将支持交互式调试和生产执行,并运行示例类 LoggingService。

这是服务本身的框架示例:

using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using System;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using System.Collections.Concurrent;

namespace AdvancedHost
{
    public class LoggingService : IHostedService, IDisposable
    {

        public Task StartAsync(CancellationToken cancellationToken)
        {
            // Startup code

            return Task.CompletedTask;
        }

        public Task StopAsync(CancellationToken cancellationToken)
        {           
            // Stop timers, services
            return Task.CompletedTask;
        }

        public void Dispose()
        {
            // dispose of non-managed resources
        }
    }
}

完成该项目所需的最后两个文件:

ServiceBaseLifetime.cs:

using Microsoft.Extensions.Hosting;
using System;
using System.ServiceProcess;
using System.Threading;
using System.Threading.Tasks;

namespace AdvancedHost
{

    public class ServiceBaseLifetime : ServiceBase, IHostLifetime
    {
        private readonly TaskCompletionSource<object> _delayStart = new TaskCompletionSource<object>();

        public ServiceBaseLifetime(IApplicationLifetime applicationLifetime)
        {
            ApplicationLifetime = applicationLifetime ?? throw new ArgumentNullException(nameof(applicationLifetime));
        }

        private IApplicationLifetime ApplicationLifetime { get; }

        public Task WaitForStartAsync(CancellationToken cancellationToken)
        {
            cancellationToken.Register(() => _delayStart.TrySetCanceled());
            ApplicationLifetime.ApplicationStopping.Register(Stop);

            new Thread(Run).Start(); // Otherwise this would block and prevent IHost.StartAsync from finishing.
            return _delayStart.Task;
        }

        private void Run()
        {
            try
            {
                Run(this); // This blocks until the service is stopped.
                _delayStart.TrySetException(new InvalidOperationException("Stopped without starting"));
            }
            catch (Exception ex)
            {
                _delayStart.TrySetException(ex);
            }
        }

        public Task StopAsync(CancellationToken cancellationToken)
        {
            Stop();
            return Task.CompletedTask;
        }

        // Called by base.Run when the service is ready to start.
        protected override void OnStart(string[] args)
        {
            _delayStart.TrySetResult(null);
            base.OnStart(args);
        }

        // Called by base.Stop. This may be called multiple times by service Stop, ApplicationStopping, and StopAsync.
        // That's OK because StopApplication uses a CancellationTokenSource and prevents any recursion.
        protected override void OnStop()
        {
            ApplicationLifetime.StopApplication();
            base.OnStop();
        }
    }
}

ServiceBaseLifetimeHostExtensions.cs:

using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace AdvancedHost
{

    public static class ServiceBaseLifetimeHostExtensions
    {
        public static IHostBuilder UseServiceBaseLifetime(this IHostBuilder hostBuilder)
        {
            return hostBuilder.ConfigureServices((hostContext, services) => services.AddSingleton<IHostLifetime, ServiceBaseLifetime>());
        }

        public static Task RunAsServiceAsync(this IHostBuilder hostBuilder, CancellationToken cancellationToken = default)
        {
            return hostBuilder.UseServiceBaseLifetime().Build().RunAsync(cancellationToken);
        }
    }
}

为了维护服务,我使用“sc”实用程序: 创建: sc create AdvancedHost binPath="C:\temp\AdvancedHost\AdvancedHost.exe" 其中“AdvancedHost”是服务名称,binPath 的值是编译后的可执行文件。

对于状态: sc 查询 AdvancedHost

启动:sc start AdvancedHost

停止:sc stop AdvancedHost

要删除(一旦停止): sc delete AdvancedHost

sc 中还包含更多功能;只需在命令行中单独输入“sc”即可。 sc的结果可以在Windows服务控制面板中看到。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从.Net Core 3创建Windows服务[关闭] 的相关文章

  • 如何向 Mono.ZeroConf 注册服务?

    我正在尝试测试 ZeroConf 示例http www mono project com Mono Zeroconf http www mono project com Mono Zeroconf 我正在运行 OpenSuse 11 和 M
  • Makefile 和 .Mak 文件 + CodeBlocks 和 VStudio

    我对整个 makefile 概念有点陌生 所以我对此有一些疑问 我正在 Linux 中使用 CodeBlocks 创建一个项目 我使用一个名为 cbp2mak 的工具从 CodeBlocks 项目创建一个 make 文件 如果有人知道更好的
  • JavaScript 错误:MVC2 视图中的条件编译已关闭

    我试图在 MVC2 视图页面中单击时调用 JavaScript 函数 a href Select a JavaScript 函数 function SelectBenefit id code alert id alert code 这里 b
  • Guid.NewGuid().GetHashCode() 用于数据库

    这对于用作数据存储 SQL Server 的 ID 可靠吗 我会使用 guid 但我更喜欢数字值 A guid更有可能代表一个记录uniquely than a numeric value 随着 GUID 确保全球唯一性 GUID 可以跨数
  • 如何停止执行的 Jar 文件

    这感觉像是一个愚蠢的问题 但我似乎无法弄清楚 当我在 Windows 上运行 jar 文件时 它不会出现在任务管理器进程中 我怎样才能终止它 我已经尝试过 TASKKILL 但它对我也不起作用 On Linux ps ef grep jav
  • Libev,如何将参数传递给相关回调

    我陷入了 libev 中争论的境地 通常 libev 在类似的函数中接收包 接收回调 没关系 但是实际操作中 我们需要派遣一个亲戚 写回调 根据收到的包裹处理具体工作 例如 S RECV MSG pstRecvMsg S RECV MSG
  • Linux 上的 RTLD_LOCAL 和dynamic_cast

    我们有一个由应用程序中的一些共享库构成的插件 我们需要在应用程序运行时更新它 出于性能原因 我们在卸载旧插件之前加载并开始使用新插件 并且只有当所有线程都使用旧插件完成后 我们才卸载它 由于新插件和旧插件的库具有相同的符号 我们dlopen
  • 测量进程消耗的 CPU 时钟

    我用 C 语言编写了一个程序 它是作为研究结果创建的程序 我想计算程序消耗的确切 CPU 周期 精确的循环次数 知道我怎样才能找到它吗 The valgrind tool cachegrind valgrind tool cachegrin
  • 如何在 Javascript 中连接 C# ActiveX 事件处理程序

    我尝试使用几个代码片段将 ActiveX 对象与 Javascript 事件处理程序挂钩 我无法确定为什么事件处理程序没有被调用 带有项目的 Github 存储库 https github com JesseKPhillips Csharp
  • 如何在多线程应用程序中安全地填充数据并 Refresh() DataGridView?

    我的应用程序有一个 DataGridView 对象和一个 MousePos 类型的列表 MousePos 是一个自定义类 它保存鼠标 X Y 坐标 类型为 Point 和该位置的运行计数 我有一个线程 System Timers Timer
  • 以编程方式创建 Blob 存储容器

    我有一个要求 即在创建公司时 在我的 storageaccount 中创建关联的 blob 存储容器 并将容器名称设置为传入的字符串变量 我已尝试以下操作 public void AddCompanyStorage string subDo
  • 如何在C#中控制datagridview光标移动

    我希望 datagridview 光标向右移动到下一列 而不是在向单元格输入数据后移动到下一行 我试图通过 dataGridView1 KeyDown 事件捕获键来控制光标 但这并不能阻止光标在将数据输入到单元格后移动到下一行 提前感谢你的
  • 在 C# 的 WebAPI 中的 ApiController 上使用“传输编码:分块”提供数据

    我需要服务分块传输使用编码数据API控制器 因为我无权访问HttpContext or the Http请求 我有点不知道在哪里写入响应以及在哪里刷新它 设置如下 public class MyController ApiControlle
  • 如何获取带有某个属性注释的所有属性?

    我刚刚从 Roslyn 开始 我想找到所有用属性名称 OneToOne 注释的属性 我启动了 SyntaxVisualizer 并能够获取对该节点的引用 但我想知道是否有更简单的方法来实现此目的 这就是我所拥有的 var prop docu
  • 将键码转换为相关的显示字符

    在 C Windows Forms 项目中 我有一个不提供 KeyPressed 事件的控件 它是一个 COM 控件 ESRI 映射 它仅提供 KeyUp 和 KeyDown 事件 包含关键事件参数 http msdn microsoft
  • .Net Reactive Extensions Framework (Rx) 是否考虑拓扑顺序?

    Net 反应式扩展框架是否按拓扑顺序传播通知以最大限度地减少更新量 就像 Scala Rx 所做的那样 Net 反应式扩展 Rx 是否可以 https github com lihaoyi scala rx wiki How it Work
  • 从后面的代码添加外部 css 文件

    我有一个 CSS 文件 例如 SomeStyle css 我是否可以将此样式表文档从其代码隐藏应用到 aspx 页面 您可以将文字控件添加到标头控件中 Page Header Controls Add new System Web UI L
  • 声明一个负长度的数组

    当创建负长度数组时 C 中会发生什么 例如 int n 35 int testArray n for int i 0 i lt 10 i testArray i i 1 这段代码将编译 并且启用 Wall 时不会出现警告 并且似乎您可以分配
  • 如果找不到指定的图像文件,显示默认图像的最佳方式?

    我有一个普通的电子商务应用程序 我将 ITEM IMAGE NAME 存储在数据库中 有时经理会拼错图像名称 为了避免 丢失图像 IE 中的红色 X 每次显示产品列表时 我都会检查服务器中是否有与该产品相关的图像 如果该文件不存在 我会将其
  • 如何为有时异步的操作创建和实现接口

    假设我有数百个类 它们使用 计算 方法实现公共接口 一些类将执行异步 例如读取文件 而实现相同接口的其他类将执行同步代码 例如将两个数字相加 为了维护和性能 对此进行编码的好方法是什么 到目前为止我读到的帖子总是建议将异步 等待方法冒泡给调

随机推荐

  • 开发黑莓应用程序的好工具包是什么? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 寻找用于一般 Blackberry 开发或应用程序工具包的工具包 SDK 有类似 MVC 框架的东西吗
  • 删除一个表中未被另一个表引用的所有记录

    2张桌子 项目 编号 用户 id item id 怎么删除里面的所有记录items未引用自users 请注意 NOT IN 可能会非常慢 有时 令人惊讶的是 这样做会更快 DELETE FROM items WHERE id IN SELE
  • 线程安全与同步

    我是java新手 我对线程安全和同步有点困惑 线程安全意味着一个方法或类实例可以被多个线程同时使用而不会出现任何问题 其中 同步意味着单个时间只能有一个线程运行 那么它们之间有何关系呢 线程安全的定义在Java 并发实践 http amzn
  • Angular2 局部模板变量

    在下面的例子中 我指定了一个局部变量 input多个单选按钮 当点击 tr 我想选择里面的单选按钮 下面的代码工作正常 但我不明白为什么 当所有输入都具有局部变量时 Angular2 如何 知道 我指的是哪个输入 input HTML tr
  • Realm gradle 任务

    在我的个人资料报告期间assembleDebuggradle 任务 我发现了两个与领域相关的 gradle 子任务 这需要相当多的时间 assembleDebug 1m21 44s transformClassesWithRealmOpti
  • 从给定的 n 个点中选择最远的 k 个点

    我有一套Sn维度中的点d如果需要的话 我可以计算所有成对距离 我需要选择k该集合中的点 使得它们的成对距离之和最大 换句话说 我想要 S 中的 p1 pk 使得 sum i j 我知道这个问题与this one https stackove
  • 从Java中的IAM用户名获取Amazon访问密钥和秘密密钥

    我碰到从 Java 中的 Amazon Access Key 获取用户名 https stackoverflow com questions 13595541 get username from amazon access key in j
  • 检查 PyObject 是否为 None

    我只是想检查一下是否PyObject我有的是None 我天真地以为任何None Pyobject 从函数返回的将是 NULL 指针 但情况似乎并非如此 那么 我如何检查是否PyObject 我的指向一个None object 我知道有类似的
  • 如何在 R 中抓取网页而不出现空网站问题?

    我需要提取有关物种的信息 并编写以下代码 然而 我对一些缺失的物种有疑问 如何才能避免这个问题呢 Q lt c rvest stringr tidyverse jsonlite lapply Q require character only
  • 在 Ubuntu 上通过 pyODBC 连接到 Microsoft SQL Server

    连接到 Microsoft SQL Server 实例时遇到问题pyODBC在一个Ubuntu 12 10 机器 我返回的错误是 pyodbc Error IM002 IM002 unixODBC Driver Manager Data S
  • Winforms DataBind 到控件的 Visible 属性

    将数据绑定到控件的可见属性时是否存在任何已知问题 无论我的属性是什么 该控件始终不可见 Public ReadOnly Property IsRibbonCategory As Boolean Get Return True End Get
  • 从 Azure DevOps 导出测试结果

    我可能遗漏了一些东西 但找不到从 Azure DevOps 中项目的构建管道执行页面导出测试运行结果的方法 有一个 下载日志 当然 从技术上讲 您可以在其中找到来自测试执行步骤的日志以及其他内容 但这似乎不是定期获取此类数据以进行法规 审计
  • 如何使用头文件签名(幻数)检查文件类型?

    通过输入文件及其扩展名 我的代码成功地从 幻数 中检测到文件的类型 magic numbers png bytes 0x89 0x50 0x4E 0x47 0x0D 0x0A 0x1A 0x0A jpg bytes 0xFF 0xD8 0x
  • Laravel 5.4 - php artisan 缓存:使用“文件”缓存驱动程序时清除不会清除缓存文件

    Laravel 5 4 应用程序 CACHE DRIVER被设定为file and QUEUE DRIVER被设定为sync in env 当我跑步时php artisan cache clear它说Cache cleared succes
  • 每个 UDP 数据报的 Netty 不同管道

    我们有一个已经在 TCP IP 中实现的服务器 但现在我们要求该协议也支持 UDP 发送的每个 UDP 数据报都包含我需要解码的所有内容 因此这是一个非常简单的回复和响应系统 数据报中的数据由换行符分隔 服务器启动时的引导代码如下所示 SE
  • 如何向 NuGet 包添加 Unity 支持?

    如何将包发布到支持 Unity 游戏引擎 的 NuGet 另外 我是否需要安装 Unity 来编译它 或者针对特定的框架版本就足够了 如何将包发布到支持 Unity 游戏引擎 的 NuGet 只需按照以下说明进行操作即可the doc ht
  • Spring MVC:如何修改从spring控制器发送的响应?

    我有一个使用 Spring MVC 3 1 3 的应用程序和使用 Dojo 1 4 开发的 UI 该应用程序有几个控制器来处理通过上传的二进制文件dojo io iframe send 控制器发送一个 json 响应 该响应必须用
  • 面板未获得焦点

    我继续在我的简单图形程序中 使用 C 编写某种键盘导航 而我又遇到了麻烦 我的问题是我想处理键盘输入以移动图层 用鼠标移动图层已经可以很好地工作 但控件没有获得焦点 此控件既不会触发 KeyUp KeyDown KeyPress 也不会触发
  • 使用 Zend 框架进行连接更新

    我试图在 mysql 上使用 zend 更新带有连接的表 下面是我想通过 zend 执行的查询 已经谢谢了 UPDATE tbproduto LEFT JOIN SELECT codigo as codTipoProduto cdTipo
  • 如何从.Net Core 3创建Windows服务[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 最近我需要将 Net Core 3 0控制台应用程序转换为Windows服务 由于我不需要将此流程移植