mirror of
https://github.com/wwiinnddyy/LanMountainDesktop.git
synced 2026-06-20 23:54:26 +08:00
8.9 KiB
8.9 KiB
插件开发 - 环境准备
前置要求
在开始开发插件之前,请确保你已经:
- ✅ 安装了 .NET 10 SDK
- ✅ 安装了支持 C# 的 IDE(Visual Studio 2022 / Rider / VS Code)
- ✅ 了解 C# 基础语法
- ✅ 了解 Avalonia UI 基础(或 WPF,两者相似)
如果还没有配置开发环境,请先阅读 开发环境配置
安装插件模板
安装官方模板
阑山桌面提供了官方的插件项目模板,可以快速创建插件项目骨架。
# 安装插件模板包
dotnet new install LanMountainDesktop.PluginTemplate
# 验证安装成功
dotnet new list | Select-String "lmd"
你应该看到类似输出:
lmd-plugin LanMountainDesktop Plugin C# LanMountainDesktop/Plugin
模板版本管理
# 查看已安装的模板
dotnet new list lmd
# 更新到最新版本
dotnet new install LanMountainDesktop.PluginTemplate --force
# 卸载模板
dotnet new uninstall LanMountainDesktop.PluginTemplate
创建第一个插件项目
使用模板创建项目
# 创建新插件项目
dotnet new lmd-plugin -n MyFirstPlugin
# 进入项目目录
cd MyFirstPlugin
项目结构
创建后的项目结构如下:
MyFirstPlugin/
├── MyFirstPlugin.csproj # 项目文件
├── Plugin.cs # 插件入口类
├── plugin.json # 插件清单
├── Components/ # 组件目录
│ └── SampleComponent.cs # 示例组件
├── Views/ # 视图目录
│ └── SampleComponentView.axaml # 组件视图
│ └── SampleComponentView.axaml.cs # 视图代码后台
├── ViewModels/ # 视图模型
│ └── SampleComponentViewModel.cs # 组件视图模型
├── Settings/ # 设置页目录
│ └── PluginSettingsPage.axaml # 设置页视图
│ └── PluginSettingsPage.axaml.cs # 设置页代码
├── Assets/ # 资源目录
│ └── icon.png # 插件图标
└── Localization/ # 本地化目录
└── Strings.resx # 字符串资源
理解插件清单
plugin.json 文件
plugin.json 是插件的元数据文件,定义了插件的基本信息。
{
"Id": "com.example.myfirstplugin",
"Name": "My First Plugin",
"Version": "1.0.0",
"Author": "Your Name",
"Description": "My first LanMountainDesktop plugin",
"MinHostVersion": "1.0.0",
"SdkVersion": "5.0.0",
"Dependencies": [],
"Permissions": [
"Network.Access"
],
"Icon": "Assets/icon.png",
"Homepage": "https://github.com/yourusername/myfirstplugin",
"Repository": "https://github.com/yourusername/myfirstplugin.git"
}
字段说明
| 字段 | 必需 | 说明 |
|---|---|---|
Id |
✅ | 插件唯一标识符,建议使用反向域名格式 |
Name |
✅ | 插件显示名称 |
Version |
✅ | 插件版本号,遵循语义化版本 |
Author |
✅ | 插件作者 |
Description |
✅ | 插件简介 |
MinHostVersion |
✅ | 最低宿主版本要求 |
SdkVersion |
✅ | 使用的 SDK 版本 |
Dependencies |
❌ | 依赖的其他插件 ID 列表 |
Permissions |
❌ | 插件所需权限列表 |
Icon |
❌ | 插件图标路径 |
Homepage |
❌ | 插件主页 URL |
Repository |
❌ | 源码仓库 URL |
版本号规范
插件版本号遵循 语义化版本 2.0.0:
主版本号.次版本号.修订号
例如: 1.2.3
- 主版本号: 不兼容的 API 修改
- 次版本号: 向下兼容的功能性新增
- 修订号: 向下兼容的问题修正
理解项目文件
MyFirstPlugin.csproj
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<!-- 插件元数据 -->
<PluginId>com.example.myfirstplugin</PluginId>
<PluginName>My First Plugin</PluginName>
<PluginVersion>1.0.0</PluginVersion>
<!-- 禁用可执行文件生成,插件是类库 -->
<OutputType>Library</OutputType>
</PropertyGroup>
<ItemGroup>
<!-- Plugin SDK -->
<PackageReference Include="LanMountainDesktop.PluginSdk" Version="5.0.0" />
<PackageReference Include="LanMountainDesktop.Shared.Contracts" Version="5.0.0" />
<!-- Avalonia UI -->
<PackageReference Include="Avalonia" Version="12.0.1" />
<PackageReference Include="Avalonia.Themes.Fluent" Version="12.0.1" />
<!-- MVVM Toolkit -->
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.2.2" />
</ItemGroup>
<!-- 复制 plugin.json 到输出目录 -->
<ItemGroup>
<None Update="plugin.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="Assets\**">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
<!-- Avalonia 编译支持 -->
<ItemGroup>
<AvaloniaResource Include="**\*.axaml" />
</ItemGroup>
</Project>
关键配置项
- TargetFramework: 必须是
net10.0 - OutputType: 必须是
Library(插件是类库,不是可执行文件) - Nullable: 建议启用,提高代码质量
- PluginId/PluginName/PluginVersion: 应与
plugin.json保持一致
构建插件
还原依赖
dotnet restore
构建项目
# Debug 模式
dotnet build
# Release 模式
dotnet build -c Release
查看输出
构建成功后,输出目录结构:
bin/Debug/net10.0/
├── MyFirstPlugin.dll # 主程序集
├── MyFirstPlugin.pdb # 调试符号
├── plugin.json # 插件清单
├── Assets/ # 资源文件
│ └── icon.png
└── *.dll # 依赖程序集
调试插件
方法一:复制到插件目录(推荐)
# 构建插件
dotnet build
# 复制到宿主的插件目录
$pluginDir = "$env:LOCALAPPDATA\LanMountainDesktop\plugins\MyFirstPlugin"
New-Item -ItemType Directory -Path $pluginDir -Force
Copy-Item -Path "bin\Debug\net10.0\*" -Destination $pluginDir -Recurse -Force
# 启动宿主应用
# (确保宿主在 Debug 模式下构建,这样可以附加调试器)
方法二:使用符号链接
在开发模式下,可以创建符号链接避免每次复制:
# 创建符号链接(需要管理员权限)
$pluginDir = "$env:LOCALAPPDATA\LanMountainDesktop\plugins\MyFirstPlugin"
$buildDir = "$(pwd)\bin\Debug\net10.0"
New-Item -ItemType SymbolicLink -Path $pluginDir -Target $buildDir -Force
方法三:配置宿主调试路径
如果你有宿主源码,可以修改宿主的插件搜索路径指向你的插件构建目录。
在宿主项目的 appsettings.Development.json 中:
{
"PluginPaths": [
"C:\\Dev\\MyFirstPlugin\\bin\\Debug\\net10.0"
]
}
附加调试器
- 启动宿主应用(LanMountainDesktop)
- 在 Visual Studio 中,选择"调试" → "附加到进程"
- 找到
LanMountainDesktop.exe进程 - 点击"附加"
- 在插件代码中设置断点
查看日志
日志位置
%LOCALAPPDATA%\LanMountainDesktop\logs\latest.log
实时查看日志
# PowerShell
Get-Content "$env:LOCALAPPDATA\LanMountainDesktop\logs\latest.log" -Wait -Tail 50
日志级别
- Trace: 最详细的信息,用于诊断
- Debug: 调试信息
- Information: 一般信息
- Warning: 警告信息
- Error: 错误信息
- Critical: 严重错误
常见问题
插件没有被加载
检查清单:
- 确认
plugin.json存在且格式正确 - 确认插件 DLL 文件存在
- 查看日志文件中的错误信息
- 确认插件 ID 唯一,没有与其他插件冲突
- 确认 SDK 版本匹配
编译错误:找不到类型
问题: error CS0246: The type or namespace name 'IPlugin' could not be found
解决方案:
# 确认引用了 PluginSdk
dotnet add package LanMountainDesktop.PluginSdk --version 5.0.0
# 清理并重新构建
dotnet clean
dotnet build
Avalonia 视图无法编译
问题: AXAML 文件编译错误
解决方案:
- 确认安装了 Avalonia NuGet 包
- 检查 AXAML 语法是否正确
- 确认
AvaloniaResource项已配置在 csproj 中 - 清理并重新构建项目
下一步
现在你已经完成了环境准备,可以继续: