跳到主要内容
版本:2.1.0

从头写一个.NET 插件

信息

考虑到此页篇幅有限,故假设你已有一定.NET 开发基础,关于类的结构和方法的调用不在此处赘述

0. 准备

1. 创建新类库项目

目标框架应为net8.0

dotnet new classlib -f net8.0 -n MyPlugin
备注

你也可以使用net8.0-windowsnet8.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()内,FileNameInfo等属性为空
  • 不能在一个程序集内实现两个抽象类,这会导致无法判断加载哪一个类而抛出异常而使插件加载失败
提示

你可以使用依赖注入获取 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! 输出了