从头写一个.NET 插件
信息
考虑到此页篇幅有限,故假设你已有一定.NET 开发基础,关于类的结构和方法的调用不在此处赘述
0. 准备
- 一个好用的脑子
- 安装.NET SDK (>=8.0)
- IDE(以下任选其一)
- Visual Studio Code
- 需安装 C#扩展
- Visual Studio
- 需安装 .NET 桌面开发 工作负载
- Rider
- Visual Studio Code
1. 创建新类库项目
目标框架应为net8.0
dotnet new classlib -f net8.0 -n MyPlugin
备注
你也可以 使用net8.0-windows
或net8.0-macos
,但可能不能在所有平台上运行
2. 拉取 Serein 代码
克隆 Serein 仓库
git clone https://github.com/SereinDev/Serein.git
或
添加为 Submodule
git submodule add https://github.com/SereinDev/Serein.git
3. 为插件项目添加项目引用
将Serein.Core.csproj
添加到项目引用
备注
你也可以将 Serein.Cli
/Serein.Lite
/Serein.Plus
作为项目引用,这在需要添加 UI 或操作窗口时会很方便,但是需要注意的是编译后的插件只能被指定类型的 Serein运行
按如下高亮部分修改 .NET 项目文件
MyPlugin.csproj
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<EnableDynamicLoading>true</EnableDynamicLoading>
</PropertyGroup>
<ItemGroup>
<!-- 根据实际情况修改路径 -->
<ProjectReference Include="../Serein/src/Serein.Core/Serein.Core.csproj">
<Private>false</Private>
<ExcludeAssets>all</ExcludeAssets>
</ProjectReference>
</ItemGroup>
</Project>
4. 编写插件信息文件
在项目文件的同目录下创建一个新的 plugin-info.json
文件,并按照此页修改
按如下高亮部分修改项目文件,使得在编译时自动更新输出目录中的插件信息文件
MyPlugin.csproj
<Project Sdk="Microsoft.NET.Sdk">
<!-- ... -->
<ItemGroup>
<!-- ... -->
<None Include="plugin-info.json" CopyToOutputDirectory="Always" />
</ItemGroup>
</Project>
5. 实现抽象类
在 v2.1.x+ 中,你的插件类必须以 Serein.Core.Services.Plugins.Net.PluginBase
为基类
备注
在 v2.0.x 中,这个类为 Serein.Core.Models.Plugins.Net.PluginBase
注意
- 在构造函数
.ctor()
内,FileName
、Info
等属性为空 - 不能在一个程序集内实现两个抽象类,这会导致无法判断加载哪一个类而抛出异常而使插件加载失败
提示
你可以使用依赖注入获取 Serein 服务
MainPlugin.cs
using Serein.Core.Models.Plugins.Net;
using System;
namespace MyPlugin;
public class MainPlugin : PluginBase
{
public MainPlugin(IServiceProvider serviceProvider)
{
Console.WriteLine("Loaded!");
}
public override void Dispose()
{
Console.WriteLine("Disposed!");
}
}
6. 编译
dotnet build
7. 复制到插件目录下
将输出目录下的所有文件复制到 Serein/plugins/MyPlugin
下,重新加载所有插件你就可以看到控制台中的 Loaded!
输出了