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

看不見的法師
发布: 2025-09-29 09:23:20
原创
886人浏览过

前言

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

什么是钩子?

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

使用钩子的步骤:

  1. 首先,创建一个控制台项目Ron.HooksDemo,作为托管主机,用于挂载钩子程序Ron.Init。
class Program {
    static void Main(string[] args) {
        Console.WriteLine("
程序已启动");
        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},
OSVersion:{1},
version:{2},
userName:{3},
CurrentDirectory:{4}
Core Count:{5}
WorkSet:{6}
Drives:{7}",
            Environment.MachineName,
            Environment.OSVersion,
            Environment.Version,
            Environment.UserName,
            Environment.CurrentDirectory,
            Environment.ProcessorCount,
            Environment.WorkingSet,
            string.Join(",", drives));
        Console.WriteLine("

正在获取网络配置.....");
        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} 	Address:{1}", ip.AddressFamily, ip);
        }
        Console.WriteLine("

正在上报启动信息.....");
        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("

程序集:Ron.License.dll");
    Console.WriteLine("作者:Ron.liang");
    Console.WriteLine("博客地址:https://www.cnblogs.com/viter/

");
    Console.WriteLine("=========== Ron.License.dll 结束 ===========");
}
登录后复制

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

AI Sofiya
AI Sofiya

一款AI驱动的多功能工具

AI Sofiya 109
查看详情 AI Sofiya

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("动态加载程序集,执行清理任务已完成

");
        Console.WriteLine("=========== Ron.Service.dll 结束 ===========");
    }
}
登录后复制

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

internal class StartupHook {
    public static void Initialize() {
        Console.WriteLine("

程序集:Ron.License.dll");
        Console.WriteLine("作者:Ron.liang");
        Console.WriteLine("博客地址:https://www.cnblogs.com/viter/

");
        string path = @"C:UsersAdministratorSourceReposRon.HooksDemoRon.ServiceinDebug
etcoreapp2.2Ron.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/e642e53491d96d64124a4d5800c43b5f

以上就是Asp.Net Core 轻松学-在.Net Core 中使用钩子的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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