开始内嵌
你有一个自己掌控的进程,要把 Hosihikari.PluginManager 嵌进去。管理器提供发现、依赖排序、隔离与生命周期;载体服务由你提供,启停也由你决定。
只是想在基岩版服务端上跑插件,用载体就好——载体本身就是已经把这些做好的宿主。
dotnet add package Hosihikari.PluginManager管理器面向 .NET 10,依赖 Hosihikari.Plugin.Abstractions 取插件契约。
using Hosihikari;using Microsoft.Extensions.DependencyInjection;using Microsoft.Extensions.Logging;
var loggerFactory = LoggerFactory.Create(builder =>{ builder.SetMinimumLevel(LogLevel.Information); builder.AddSimpleConsole(options => options.SingleLine = true);});
var services = new ServiceCollection() .AddSingleton(loggerFactory) .BuildServiceProvider();
var manager = new PluginManager( pluginsRoot: Path.Combine(root, "plugins"), dataRoot: Path.Combine(root, "data", "hosihikari"), configRoot: Path.Combine(root, "config", "hosihikari"), reportFault: entry => loggerFactory.CreateLogger("Hosihikari").LogError("加载问题:{Entry}", entry), carrierServices: services, onRemoved: name => { /* 插件已经不在了,把你自己的记录摘掉 */ });三个根目录归你管。管理器按需创建 data/ 与 config/ 下的子目录;它不会替你建 plugins/,缺这个目录就等于没有插件。
reportFault收到的是钩子之外的问题——进程死了、协议出错、包在装载前被拒。carrierServices是插件通过IPluginContext.CarrierServices取用的IServiceProvider。往里放一个ILoggerFactory:不放的话插件拿到空日志器,它们写的每一行都会无声消失。onRemoved在故障插件卸载成功之后触发,供你把那一条从自己的注册表里摘掉。
登记你支持的加载器
Section titled “登记你支持的加载器”管理器本身不会装载任何东西。加载器是一个插件包,装载时把自己登记进来;内置的程序集加载器负责预编译 DLL:
manager.RegisterLoader(new AssemblyPluginLoader());manager.LoadAll();要支持源码插件,把对应的加载器包和其他插件一起装上,让它自己登记;见载体服务。
给七参数构造函数传 PluginManagerOptions:
var options = new PluginManagerOptions{ UnloadVerificationTimeout = TimeSpan.FromSeconds(60),};
var manager = new PluginManager(pluginsRoot, dataRoot, configRoot, reportFault, carrierServices, onRemoved, options);UnloadVerificationTimeout 是确认已放下的插件真的被回收的时间预算,默认 30 秒。有限值必须为正且不超过约 49.7 天;不限时用 Timeout.InfiniteTimeSpan。超时是生命周期里描述的失败方式之一。
插件本身怎么写在写插件。
