netcore下开发windows服务如果是web项目的话,由于aspnetcore本身是支持的,把默认的host.Run改为host.RunAsService就可以了。

但是普通的netcore的控制台项目我终于找到了如下方式来实现:

  1. Microsoft.Extensions.Hosting

  2. System.ServiceProcess.ServiceController

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

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

public static void RunAsService(this IHostBuilder hostBuilder)    {        hostBuilder.UseServiceBaseLifetime().Build().Run();    }

public static Task RunAsServiceAsync(this IHostBuilder hostBuilder)    {return hostBuilder.UseServiceBaseLifetime().Build().RunAsync(CancellationToken.None);    }}
public class TestService: IHostedService,IDisposable{readonly System.Timers.Timer tmBak = new System.Timers.Timer();

public TestService()    {        tmBak.Interval = 1000;//1秒执行1次        tmBak.AutoReset = true;//执行1次false,一直执行true        tmBak.Enabled = true;        tmBak.Elapsed += (sender, eventArgs) =>        {using (StreamWriter sw = new StreamWriter("D:\\log.txt",true))            {                sw.WriteLine($"AntDeploy Windows服务:{DateTime.Now:yyyy-MM-dd HH:mm:ss}");            }        };    }

public Task StartAsync(CancellationToken cancellationToken)    {        tmBak.Start();return Task.CompletedTask;    }

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

public void Dispose()    {this.tmBak.Dispose();    }}
class Program{// P/Invoke declarations for Windows.[DllImport("kernel32.dll")] static extern IntPtr GetConsoleWindow();[DllImport("user32.dll")] static extern bool IsWindowVisible(IntPtr hWnd);public static bool HaveVisibleConsole(){return RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ?IsWindowVisible(GetConsoleWindow()):Console.WindowHeight > 0;}

private static async Task Main(string[] args)    {var pathToExe = Process.GetCurrentProcess().MainModule.FileName;var pathToContentRoot = Path.GetDirectoryName(pathToExe);        Directory.SetCurrentDirectory(pathToContentRoot);

var isService = !(Debugger.IsAttached || args.Contains("--console"));

if (HaveVisibleConsole()) isService = false;var builder = new HostBuilder()            .ConfigureServices((hostContext, services) =>            {                services.AddHostedService<TestService>();            });

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

AntDeploy是我开发的一款开源一键部署vs插件(也是支持脱离vs单独使用的一个开源工具)

开源地址:https://github.com/yuzd/AntDeployAgent

添加一个环境 名字叫 测试 然后 在 测试环境里面添加 windows服务器 这里我做测试就添加就是我本机,注意Host里面是填写格式为:ip:端口号

注意:Token不是windows服务器的密码!!!是安装agent后,agent的配置文件里面配置的Token(你自己自定义配置的)
注意:Port不是你要发布的项目的端口号!!!是安装agent后,agent的配置文件里面配置的端口号(你自己自定义配置的)
点击【Connect Test】按钮进行确认agent可以成功链接,否则会发布失败
如果【Connect Fail】失败 请查看 #10

进入 WindowsService Tab界面

Sdk类型选择 netcore
ServiceName 填写上面我们设置的名称:[TestService]

点击 【Deploy】按钮进行发布

确认服务器无误 点击 【是】开始执行一键部署
如果发布出现错误会出现下图所示:

可以在Log里面查看失败原因是因为我部署agent没有用管路员权限 报权限不足失败 需要用管理员权限运行agent才行

部署成功 如下图:

查看D盘下是否log.txt是否正常每隔1秒写入了当前时间

这里演示的是windows服务上没有这个service
所以自动创建了。
如果service已存在的情况 Deploy 就会全量覆盖 不会重新创建site的。
如果想要覆盖时排除指定文件 可以在 Setting Tab界面的IgnoreList里面增加(支持正则)

原文地址:https://www.cnblogs.com/yudongdong/p/10630835.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

netcore开发windows普通服务(非Web)并一键发布到服务器相关推荐

  1. 如何在windows下实现快捷命令,一键ssh连接服务器

    如何在windows下实现快捷命令,一键ssh连接 每次在windows下连接远程服务器的时候,都要手动ssh root@ip地址,然后每次都要苦恼于这个命令的输入,还要苦恼于ip地址记不住,于是要找 ...

  2. 为什么某些Win32技术在Windows NT服务中行为不当?

    弗兰克·金 服务是具有特殊要求的后台Win32进程.它需要一个独特的入口点和一个回调函数.回调函数被称为服务控制处理程序.新的入口点通常称为ServiceMain,但您可以任意命名. 本文假定您熟悉W ...

  3. C#开发Windows Service程序

    Windows Service概念介绍 Windows Service,也称Windows服务,是32位Windows操作系统中一种长期运行的后台程序.它们长期后台运行,没有用户界面,默默无闻,但它们 ...

  4. 【招聘(北京)】.NETCORE开发工程师(微服务方向)

    组织:华汽集团北京研发中心 位置:北京市朝阳区焦奥中心 官网:www.sinoauto.com 邮箱:taoxu.wei@sinoauto.com 项目:打造面向国内汽车后市场用户的一站式云服务平台( ...

  5. Windows 网络服务架构系列课程详解(六) ---利用NLB群集实现WEB服务器的可靠性...

    Windows 网络服务架构系列课程详解(六) -----利用NLB群集实现WEB服务器的可靠性   实验背景: 在大型网络环境中存在这样一种情景,公司内部的FTP服务器出现故障或脱机了,而且不能快速 ...

  6. 利用vs.net快速开发windows服务(总结)

    引用 http://www.cnblogs.com/lovecherry/archive/2005/03/25/125527.html 在很多应用中需要做windows服务来操作数据库等操作,比如 ( ...

  7. .NET开发Windows服务

    一.概述 本文旨在简单论述如何开发Windows服务程序. 服务名称:ServiceTest 实验环境:VS2015 最终程序结构: 二.步骤 1.创建一个项目,选择Windows 服务,更改项目名称 ...

  8. 用.Net开发Windows服务初探

    用.Net开发Windows服务初探 1 什么是Windows服务         Windows服务应用程序是一种需要长期运行的应用程序,它对于服务器环境特别适合.它没有用户界面,并且也不会产生任何 ...

  9. 如果彩虹QQ算非法外挂,那么运行在windows上的非微软开发的程序算什么?

    如果彩虹QQ算非法外挂,那么运行在windows上的非微软开发的程序算什么?你腾讯QQ不也是利用了一堆微软提供的信息,开放的API了吗?你腾讯QQ不也是windows上的外挂程序吗? 也许有人要说腾讯 ...

最新文章

  1. 你陪我长大 我陪你变老
  2. 从一次故障聊聊前端 UI 自动化测试
  3. RocketMQ几种搭建模式说明
  4. golang 不定参 可变参 使用 传递
  5. 添加lombok插件
  6. 学习编程可以参考哪些网站?
  7. 马逊s3云存储接口_利用 S3tests 测试 S3 接口兼容性
  8. codeforce R 491 (div2)
  9. 面向航空航天工业领域的基于模型的仿真验证工具SkyEye
  10. java 基本类型 包装类型_Java中基本类型和包装类
  11. dubbo注册中心介绍
  12. 【渝粤教育】国家开放大学2018年春季 0434-21T高级英语口语 参考试题
  13. 总感觉这个访问量过于均匀……
  14. 红外通信模块——详细资料(含遥控器按键对应的码值)
  15. 单场淘汰制场次计算方法_校园足球联赛赛制的设计与编排
  16. 渗透测试学习笔记之案例一
  17. php 计费系统设计,仓储系统之计费模块设计
  18. Android车载蓝牙相关开发1:概述及准备
  19. connect: cannot assign requested address
  20. 使用Kettle 进行行Oracle数据迁移时处理编码转换处理US7ASCII 编码

热门文章

  1. 初学者java学习计划_初学者:计划在Windows 7 Media Center中录制直播电视的时间
  2. Vue.js中的8种组件间的通信方式;3个组件实例是前6种通信的实例,组件直接复制粘贴即可看到运行结果
  3. zookeeper的单实例和伪集群部署
  4. 二 面向对象三大特性
  5. 阿里云MaxCompute香港开服 将引入更多人工智能服务
  6. 静态属性,函数闭包,call/apply,继承
  7. 上帝的玩偶:haXe语言
  8. .net core入门之web应用
  9. phpmyadmin 安装 配置
  10. Windows Server 2003域和活动目录