0

0

Asp.Net Core 轻松学-在.Net Core 中使用钩子

看不見的法師

看不見的法師

发布时间:2025-09-29 09:23:20

|

896人浏览过

|

来源于php中文网

原创

前言

Host startup hook是2.2版本中引入的一项新功能,通过使用主机启动钩子,开发者可以在不修改代码的前提下,在服务启动之前注入代码。利用钩子,开发者可以在服务启动期间自定义托管程序的行为,对已部署的服务进行定制。此外,钩子还可以用于服务的跟踪和遥测,启动前的托管环境健康检查,甚至通过动态加载程序集实现依赖注入等功能。

什么是钩子?

钩子是一种在服务启动时注入自定义代码的机制。

使用钩子的步骤:

  1. 首先,创建一个控制台项目Ron.HooksDemo,作为托管主机,用于挂载钩子程序Ron.Init。
class Program {
    static void Main(string[] args) {
        Console.WriteLine("\n程序已启动");
        Console.ReadKey();
    }
}
  1. 创建钩子程序Ron.Init。

2.1 根据钩子程序的规范,创建一个无命名空间的内部类StartupHook,并包含默认的静态方法Initialize()。

internal class StartupHook {
    public static void Initialize() {
        Console.WriteLine("程序集:Ron.Init.dll");
        Console.WriteLine("正在获取服务器信息.....");
        string[] drives = Environment.GetLogicalDrives();
        Console.WriteLine("machineName:{0},\nOSVersion:{1},\nversion:{2},\nuserName:{3},\nCurrentDirectory:{4}\nCore Count:{5}\nWorkSet:{6}\nDrives:{7}",
            Environment.MachineName,
            Environment.OSVersion,
            Environment.Version,
            Environment.UserName,
            Environment.CurrentDirectory,
            Environment.ProcessorCount,
            Environment.WorkingSet,
            string.Join(",", drives));
        Console.WriteLine("\n\n正在获取网络配置.....");
        var hostName = Dns.GetHostName();
        Console.WriteLine("HostName:{0}", hostName);
        var addresses = Dns.GetHostAddresses(hostName);
        foreach (var item in addresses) {
            IPAddress ip = item.MapToIPv4();
            Console.WriteLine("AddressFamily:{0} \tAddress:{1}", ip.AddressFamily, ip);
        }
        Console.WriteLine("\n\n正在上报启动信息.....");
        Console.WriteLine("=========== Ron.Init.dll 结束 ===========");
    }
}

Asp.Net Core 轻松学-在.Net Core 中使用钩子

2.2 运行程序,检查是否正确挂载了钩子程序Ron.Init。

Asp.Net Core 轻松学-在.Net Core 中使用钩子

  1. 挂载多个钩子。

3.1 一个托管程序可以挂载多个钩子。Windows平台的挂载方式:

DOTNET_STARTUP_HOOKS = C:\Hooks_1.dll;C:\Hooks_2.dll

Unix平台的挂载方式:

DOTNET_STARTUP_HOOKS =/data/Hooks_1.dll:/data/Hooks_2.dll

3.2 运行挂载了多个钩子的托管程序。将两个钩子Ron.Init和Ron.License挂载到Ron.HooksDemo项目。

public static void Initialize() {
    Console.WriteLine("\n\n程序集:Ron.License.dll");
    Console.WriteLine("作者:Ron.liang");
    Console.WriteLine("博客地址:https://www.cnblogs.com/viter/\n\n");
    Console.WriteLine("=========== Ron.License.dll 结束 ===========");
}

钩子程序Ron.License的代码非常简单,结构与Ron.Init钩子程序类似,仅用于输出版权信息。

Designer
Designer

Microsoft推出的图形设计应用程序

下载

3.3 运行Ron.HooksDemo程序,查看输出结果。

Asp.Net Core 轻松学-在.Net Core 中使用钩子

  1. 在钩子中加载额外的程序集。

4.1 在Ron.License中加载一个程序集Ron.Service,Ron.Service中定义了一个类UserService,继承并实现了IDisposable接口。

public class UserService : IDisposable {
    public void Dispose() {
        Console.WriteLine("程序集:Ron.Service.dll");
        Console.WriteLine("动态加载程序集,执行清理任务已完成\n\n");
        Console.WriteLine("=========== Ron.Service.dll 结束 ===========");
    }
}

4.2 在Ron.License的钩子方法中加载Ron.Service程序集,创建IDisposable的实现,并调用Dispose()方法。

internal class StartupHook {
    public static void Initialize() {
        Console.WriteLine("\n\n程序集:Ron.License.dll");
        Console.WriteLine("作者:Ron.liang");
        Console.WriteLine("博客地址:https://www.cnblogs.com/viter/\n\n");
        string path = @"C:\Users\Administrator\Source\Repos\Ron.HooksDemo\Ron.Service\bin\Debug\netcoreapp2.2\Ron.Service.dll";
        var assembly = AssemblyLoadContext.Default.LoadFromAssemblyPath(path);
        dynamic obj = assembly.CreateInstance("Ron.Service.UserService");
        obj.Dispose();
        Console.WriteLine("=========== Ron.License.dll 结束 ===========");
    }
}

4.3 运行Ron.HooksDemo程序。

Asp.Net Core 轻松学-在.Net Core 中使用钩子

  1. 在Asp.Net Web Api项目中使用钩子。
"DOTNET_STARTUP_HOOKS": "C:\\Users\\Administrator\\Source\\Repos\\Ron.HooksDemo\\Ron.Init\\bin\\Debug\\netcoreapp2.2\\Ron.Init.dll;C:\\Users\\Administrator\\Source\\Repos\\Ron.HooksDemo\\Ron.License\\bin\\Debug\\netcoreapp2.2\\Ron.License.dll"

5.1 运行Web Api项目Ron.HooksDemo.Web。

Asp.Net Core 轻松学-在.Net Core 中使用钩子

结束语

钩子程序不能依赖于托管主机的TPA列表之外的任何程序集,否则会抛出FileNotFoundException异常。不要挂载过多的钩子程序,这可能会出现兼容性问题。如果要使用多个钩子,必须确保每个钩子程序的行为都是独立的,互不干扰的。如果一定要使用,建议修改托管主机的代码,使用依赖注入的方式而不是钩子。StartupHook类应该是internal类型的,如果使用public进行修饰,仍然可以正常加载钩子程序。

演示代码下载:https://www.php.cn/link/e642e53491d96d64124124a4d5800c43b5f

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1021

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

64

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

415

2025.12.29

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

578

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1102

2023.07.27

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

791

2023.08.01

windows查看端口被占用的情况
windows查看端口被占用的情况

windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。

452

2023.08.02

windows无法访问共享电脑
windows无法访问共享电脑

在现代社会中,共享电脑是办公室和家庭的重要组成部分。然而,有时我们可能会遇到Windows无法访问共享电脑的问题。这个问题可能会导致数据无法共享,影响工作和生活的正常进行。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2349

2023.08.08

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

27

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

微信小程序开发之API篇
微信小程序开发之API篇

共15课时 | 1.2万人学习

Laravel---API接口
Laravel---API接口

共7课时 | 0.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号