前言
Host startup hook是2.2版本中引入的一项新功能,通过使用主机启动钩子,开发者可以在不修改代码的前提下,在服务启动之前注入代码。利用钩子,开发者可以在服务启动期间自定义托管程序的行为,对已部署的服务进行定制。此外,钩子还可以用于服务的跟踪和遥测,启动前的托管环境健康检查,甚至通过动态加载程序集实现依赖注入等功能。
什么是钩子?
钩子是一种在服务启动时注入自定义代码的机制。
使用钩子的步骤:
class Program {
static void Main(string[] args) {
Console.WriteLine("
程序已启动");
Console.ReadKey();
}
}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 结束 ===========");
}
}
2.2 运行程序,检查是否正确挂载了钩子程序Ron.Init。

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钩子程序类似,仅用于输出版权信息。
3.3 运行Ron.HooksDemo程序,查看输出结果。

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程序。

"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。

结束语
钩子程序不能依赖于托管主机的TPA列表之外的任何程序集,否则会抛出FileNotFoundException异常。不要挂载过多的钩子程序,这可能会出现兼容性问题。如果要使用多个钩子,必须确保每个钩子程序的行为都是独立的,互不干扰的。如果一定要使用,建议修改托管主机的代码,使用依赖注入的方式而不是钩子。StartupHook类应该是internal类型的,如果使用public进行修饰,仍然可以正常加载钩子程序。
演示代码下载:https://www.php.cn/link/e642e53491d96d64124a4d5800c43b5f
以上就是Asp.Net Core 轻松学-在.Net Core 中使用钩子的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号