跳到主要内容
版本:2.x

从头写一个.NET插件

信息

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

准备

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添加到项目引用

按如下高亮部分修改项目文件(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文件,并按照插件信息页修改

按如下高亮部分修改项目文件,使得在编译时自动复制插件信息文件

<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>

<None Include="plugin-info.json" CopyToOutputDirectory="Always" />
</ItemGroup>

</Project>

5. 实现抽象类

你的插件类必须以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