src/docs/runtime-plugin-service.md
Service,并与 ServiceSettings 持久化绑定。PluginContext,承载 HTTP、日志、通知、配置存储等能力。STranslate/Core/PluginManager.cs
LoadPlugins():扫描目录、去重、加载程序集与插件类型。InstallPlugin() / UpgradePlugin() / UninstallPlugin():包安装与目录标记策略。STranslate/Core/ServiceManager.cs
LoadServices():根据 ServiceSettings + 插件配置文件恢复服务实例。AddService() / RemoveService():服务实例新增删除。STranslate/Services/BaseService.cs
STranslate/Core/PluginContext.cs
STranslate.Plugin/Service.cs
Initialize() 调用 Plugin.Init(Context),Dispose() 释放上下文与插件。PluginManager.LoadPlugins() 遍历 DataLocation.PluginDirectories(预装 + 用户目录)。NeedDelete:直接清理目录。NeedUpgrade:去除后缀并覆盖原目录。plugin.json,反序列化为 PluginMetaData,校验执行文件存在。PluginID 分组,保留版本最新项,重复项仅记录日志不加载。PluginAssemblyLoader 加载程序集,反射定位实现 IPlugin 的类型,写回 PluginMetaData.PluginType。PluginSettingsDirectoryPathPluginCacheDirectoryPathServiceManager.LoadServices() 先清理被标记删除的插件配置/缓存目录。*.json(文件名即 SvcID),与 ServiceSettings 的四类 ServiceData 做 join。Service:
PluginMetaDataServiceID、DisplayName、IsEnabledTranslationOptions(执行模式、自动回译)PluginContext(metaDataClone, serviceID)CreatePluginService() 反射实例化插件service.Initialize() 调用插件 Init(context),进入可用状态。ServiceSettings 自动移除并落盘;失效的 ReplaceSvcID / ImageTranslateSvcID / ImageTranslateOcrSvcID 也会自动重置。Init 中调用 context.LoadSettingStorage<T>()。PluginStorage<T> 使用 PluginSettingsDirectoryPath/{serviceId}.json 作为存储位置。context.SaveSettingStorage<T>() 写盘;服务销毁时 PluginContext.Dispose() 会删除当前服务配置并尝试清理空目录。.spkg 解压到临时目录,校验 plugin.json,按插件 ID 决定目标目录(预装目录或用户目录),加载成功后加入运行集合。NeedDelete 标记,新目录以 NeedUpgrade 后缀落位,等待重启生效。PluginMetaData:插件标识、执行文件、图标、类型、目录、设置/缓存路径。Service:运行时服务实例(ServiceID、Plugin、Context、Options)。ServiceData:可持久化的服务配置项(启用状态、名称、翻译选项)。PluginInstallResult / PluginLoadResult:安装/加载结果模型。STranslate/Core/PluginManager.csSTranslate/Core/ServiceManager.csSTranslate/Services/BaseService.csSTranslate/Core/PluginContext.csSTranslate/Services/PluginInstance.csSTranslate.Plugin/PluginMetaData.csSTranslate.Plugin/Service.csBaseService.OnPluginMetaDatasCollectionChanged 与对应服务模块加载逻辑。PluginManager.InstallPlugin 与 MoveToPluginPath,不要破坏 NeedUpgrade / NeedDelete 标记语义。DataLocation.PluginSettingsDirectory 的 SvcID.json 与 ServiceSettings 四类列表是否一致。Init 中做版本迁移,再 SaveSettingStorage,避免在主程序层硬编码插件私有结构。