高危插件开发
这一页讲怎么给 Let's Meow Toolbox 写一个高危插件。先重申项目的铁律:所有高危功能只允许以外置 DLL 插件的形式出现,主程序本体(LetsMeowToolbox.exe)不包含任何高危代码,仅通过 LetsMeowToolbox.PluginAbstractions 定义的接口动态加载并调用插件。
官方参考实现是 src/LetsMeowToolbox.Plugins.HighRisk/,里面有三个操作:DefenderAction(关闭 Defender)、FirewallAction(关闭防火墙)、EdgeAction(移除 Edge·WebView2)。看不懂契约的时候,照着它抄结构就行。
契约一:IHighRiskPlugin(插件本体)
每个插件程序集实现一个 IHighRiskPlugin:
csharp
public interface IHighRiskPlugin
{
/// 插件唯一标识(建议使用反向域名风格)。
string Id { get; }
/// 插件显示名称。
string PluginName { get; }
/// 插件简介(人话说明)。
string Description { get; }
/// 版权信息(作者 / 项目主页,写入“特别鸣谢”)。
string Credit { get; }
/// 该插件提供的全部高危操作。
IReadOnlyList<IHighRiskAction> Actions { get; }
}几个字段的用意:
Description要求写“人话”,因为它是直接展示给普通用户看的;Credit会被写进程序内的「特别鸣谢」页面,请如实填写作者与项目主页。
契约二:IHighRiskAction(单个操作)
插件里的每个高危操作实现一个 IHighRiskAction。接口注释里有一句必须遵守的话:仅描述“做什么”,是否允许执行由用户在界面手动确认后触发,插件内禁止有任何“自动执行、自动确认、无提示”逻辑。
csharp
public interface IHighRiskAction
{
string Id { get; } // 操作唯一标识
string Title { get; } // 操作名称
string Description { get; } // 人话说明:做什么、会有什么影响
string Warning { get; } // 高危风险提示文案(启用前必须向用户展示并二次确认)
string RegistryNote { get; } // 底层注册表 / API 路径(可选,供“显示底层路径”使用)
bool RequiresAdmin { get; } // 是否需要管理员权限
// 检测该操作在当前系统是否可用(例如版本不匹配时返回 false,界面隐藏)
bool IsAvailable();
// 检测该操作当前是否处于“已启用”状态(用于还原按钮 / 状态显示)
bool IsApplied();
// 执行该高危操作。返回是否成功
bool Apply();
// 还原该操作。返回是否成功
bool Restore();
}方法设计的用意:
IsAvailable()返回false时界面会隐藏该操作,用来处理“当前系统版本不适用”的情况;IsApplied()用于状态显示和还原按钮;Apply()/Restore()返回真实结果,主程序会记录日志并展示给用户。
元数据:结果与程序集标记
PluginMetadata.cs 里还有两个辅助类型:
csharp
/// 插件操作执行结果。返回给主程序用于记录日志与展示。
public sealed record HighRiskActionResult(bool Success, string Message);
/// 标记高危插件程序集的特性,便于主程序识别与展示。
[AttributeUsage(AttributeTargets.Assembly)]
public sealed class HighRiskPluginAttribute : Attribute
{
public string Name { get; }
public string Version { get; }
public HighRiskPluginAttribute(string name, string version) { ... }
}开发步骤
- 新建类库新建一个 `net8.0-windows` 类库工程,引用 `LetsMeowToolbox.PluginAbstractions`。
- 实现 IHighRiskPlugin填好 Id、PluginName、Description、Credit,并在 Actions 里返回你的操作列表。
- 为每个操作实现 IHighRiskAction写清楚 Description 与 Warning(这是给用户看的风险提示,别敷衍);按需实现 RequiresAdmin、IsAvailable、IsApplied、Apply、Restore。
- 标记程序集添加 `[assembly: HighRiskPlugin("插件名", "版本")]`,便于主程序识别与展示。
- 放进 plugins 目录编译出 DLL 后,放到主程序同级的 `plugins/` 目录(与 LetsMeowToolbox.exe 平级)。主程序启动时会动态加载;把 DLL 删掉就等于移除插件。
强制规则(违反就别提 PR)
- 高危功能一律外置 DLL,禁止把高危代码合入主程序;
- 插件内禁止“自动执行、自动确认、无提示”逻辑——执行前必须由用户在界面看到
Warning并二次确认; Apply/Restore必须返回真实执行结果,供主程序记录日志与展示;- 系统核心目录与系统核心进程受主程序内置黑名单保护,插件也不应绕过这类安全边界。
第三方高危插件由开发者自行负责。主程序只提供加载与确认框架,不为插件的行为背书。