插件依赖
约 653 字大约 2 分钟
2026-08-14
本页介绍插件与宿主、插件与插件之间的依赖关系,以及外部包版本冲突的处理方式。
宿主提供的依赖
以下程序集由宿主在进程内提供,插件不需要打包,也不应期望自己控制它们的版本:
SecRandom.Shared、SecRandom.Core、SecRandom.PluginSdk- Avalonia、FluentAvalonia 及其依赖
Microsoft.Extensions.*(Host、DependencyInjection、Logging 等)- 宿主已引用的其它运行时程序集
SRPX 打包目标会自动排除这些宿主提供程序集,因此插件包始终保持宿主无关。插件 SDK 通过 PackageReference + ExcludeAssets="runtime;native" 引用,只带来编译期 API。
外部包依赖
插件自己的外部 NuGet 依赖默认 copy-local,会随 .srpx 包一起分发:
- 插件包根目录除
manifest.yml、入口程序集外,还包含所有外部程序集依赖。 - 打包目标会排除宿主提供的程序集、
runtimes/**与本地区域资源,其余文件都会进入包内。
插件间依赖
插件可以在 manifest.yml 中声明对其它插件的依赖,宿主会按依赖拓扑排序加载:
dependencies:
- id: some.other.plugin
required: true- 必需依赖缺失或加载失败时,当前插件标记为加载失败;可选依赖(
required: false)缺失不影响加载。 - 依赖循环会被检测并拒绝加载。
外部依赖版本冲突
每个插件在独立的加载上下文(PluginLoadContext)中加载,插件之间不会因为同名程序集而互相覆盖。但插件之间要协作时,请注意以下规则:
- 宿主依赖的版本由宿主决定,插件应针对宿主提供的 Core 契约版本开发,不要试图在包内携带不同版本的宿主程序集。
- 多个插件共享同一外部库时,各自上下文里同名程序集的版本应保持一致;若共享代码(如通过插件间依赖协作)期望同一个静态状态或类型,版本不一致会导致各加载到不同副本,出现"类型不相等""事件收不到"等难以排查的问题。
- 如果需要与其它插件协作,优先使用插件间依赖(
dependencies)与宿主 DI,而不是共享某个第三方库的静态状态。
保持简单
插件尽量使用宿主提供的依赖(Core / Avalonia / Microsoft.Extensions),把对外部第三方库的依赖控制在必要范围内,能显著降低与其它插件冲突的概率。
贡献者
更新日志
2026/8/16 05:38
查看所有更新日志
4088d-Update navbar links and remove Advanced Settings于
版权所有
版权归属:SECTL
许可证:CC BY-NC-SA 4.0
