快速上手
本章节将带领你从零开始搭建一个 Lertaro 原生 C# 插件项目,实现核心接口并完成本地加载与调试。
1. 搭建插件类库工程
Lertaro 插件是一个标准的 .NET 10 类库项目。新建一个 C# 类库工程并配置 .csproj 文件:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net10.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<!-- 仅当插件需要直接编写自定义 XAML/WPF 界面控件时才需开启 UseWPF -->
<UseWPF>true</UseWPF>
<!-- 前缀是强制要求:加载器会跳过任何程序集名不以 "Lertaro.Plugins." 开头的 DLL(不区分大小写) -->
<AssemblyName>Lertaro.Plugins.MyCustomPlugin</AssemblyName>
<Version>1.0.0</Version>
</PropertyGroup>
<ItemGroup>
<!-- 引用已安装的 Lertaro 应用目录中的 SDK。本仓库里随包发布的插件改用指向 PluginSdk/ 的 <ProjectReference> -->
<Reference Include="Lertaro.PluginSdk">
<HintPath>C:\Program Files\Lertaro\Lertaro.PluginSdk.dll</HintPath>
<Private>false</Private>
</Reference>
</ItemGroup>
<ItemGroup>
<AssemblyMetadata Include="Lertaro.Plugin.Name" Value="My Custom Plugin" />
<AssemblyMetadata Include="Lertaro.Plugin.Description" Value="这是一个演示 Lertaro 插件开发的基础范例。" />
</ItemGroup>
</Project>WARNING
App 与当前用户的 Hook 按 Lertaro.Plugins.*.dll 文件名筛选,并在加载或反射之前排除禁用的程序集。请在 AssemblyName 中保留此前缀,且不要附带另一份 SDK。避免引用其他原生插件入口 DLL,否则标准程序集解析器可能把已禁用的依赖加载进来。
TIP
纯逻辑型插件(如搜索源、别名转写引擎、命令行工具)无需启用 <UseWPF>。
2. 实现插件主入口 IPlugin
建议每个程序集只提供一个公开的 IPlugin 入口,负责介绍、配置及可选的重启准备。也支持只有 Provider 的程序集,例如 PinyinAlias。
using Lertaro.PluginSdk.Abstractions.Plugins;
namespace Lertaro.Plugins.MyCustomPlugin;
public class MyCustomPlugin : IPlugin
{
public string Name => "My Custom Plugin";
public string Description => "这是一个演示 Lertaro 插件开发的基础范例。";
}设置界面按程序集组织组件。多个入口类不会形成可独立禁用的插件;需要独立管理的功能应拆成不同程序集。
在此基础上,你可以根据插件的功能定位组合实现其他 SDK 接口。例如让该类同时实现 IInstantResultProvider 提供即时答案计算,或实现 IConfigurable 提供可视化的参数配置表单。
3. 部署与加载机制
- 编译你的插件项目生成
Lertaro.Plugins.MyCustomPlugin.dll。 - 将编译生成的 DLL(及该插件所依赖的第三方库)放入 Lertaro App 根目录下的
Plugins\文件夹中。为每个插件建一个独立子目录是通行约定,且扫描是递归的(Plugins\**\*.dll),所以Plugins\MyCustomPlugin\可用;仓库内的构建自动化则把 DLL 平铺放进Plugins\,这样同样有效。 - 启动或重启 Lertaro。App 加载已启用的插件程序集;禁用插件通过静态元数据展示。
- 打开设置 → 插件,即可在已安装列表中看到你的插件及其组件运行状态。
NOTE
如果你的插件提供 IAliasProvider 或 ITranslationProvider,后台的 Service 也需要同一个 DLL:这两类还会在 Service 中被加载,以便索引出来的行带上正确的别名与标签。这就是随包发布的插件项目会把产物同时复制到 App\bin\...\Plugins\ 和 Service\bin\...\Plugins\ 的原因。
4. 调试与日志输出
在插件代码中建议全程使用 Logger(注意:它位于根命名空间 Lertaro.PluginSdk,而不是 Lertaro.PluginSdk.Services)进行日志跟踪记录:
using Lertaro.PluginSdk;
Logger.Log("插件初始化完成,已成功挂载服务。", LogLevel.Info);- 输出的日志行会实时同步呈现在 Lertaro 的设置 → 运行状态 → App 标签页中。
- 支持直接在界面上按日志等级过滤(Error / Warn / Info / Debug)并进行全文关键词搜索,便于排查问题。