GeneralUpdate.Extension
定义
命名空间:GeneralUpdate.Extension
程序集:GeneralUpdate.Extension.dll
NuGet 包:GeneralUpdate.Extension
GeneralUpdate.Extension 是一个受 VS Code 启发的 .NET 应用程序扩展管理系统。它提供完整的插件/扩展管理功能,包括扩展下载、安装、更新、版本兼容性检查、平台支持、依赖关系解析和回滚机制。
public class GeneralExtensionHost : IExtensionHost
{
public IExtensionCatalog ExtensionCatalog { get; }
public event EventHandler<ExtensionUpdateEventArgs>? ExtensionUpdateStatusChanged;
}
快速开始
最基本的使用示例,初始化扩展主机并查询远程扩展 [查看完整示例]。
using GeneralUpdate.Extension;
using GeneralUpdate.Extension.Core;
using GeneralUpdate.Extension.Common.Models;
using GeneralUpdate.Extension.Common.DTOs;
// 1. 初始化扩展主机
var options = new ExtensionHostOptions
{
ServerUrl = "https://extensions.example.com/api",
BearerToken = "your-bearer-token", // 可选:用于身份验证
HostVersion = "1.0.0", // 您的应用程序版本
ExtensionsDirectory = "./extensions" // 扩展安装目录
};
var host = new GeneralExtensionHost(options);
// 2. 订阅更新事件
host.ExtensionUpdateStatusChanged += (sender, e) =>
{
Console.WriteLine($"扩展: {e.ExtensionName}");
Console.WriteLine($"状态: {e.Status}");
Console.WriteLine($"进度: {e.Progress}%");
};
// 3. 查询可用扩展
var query = new ExtensionQueryDTO
{
Platform = TargetPlatform.Windows,
HostVersion = "1.0.0",
PageNumber = 1,
PageSize = 20
};
var result = await host.QueryExtensionsAsync(query);
if (result.Success && result.Data != null)
{
foreach (var ext in result.Data.Items)
{
Console.WriteLine($"{ext.DisplayName} v{ext.Version}");
Console.WriteLine($"兼容: {ext.IsCompatible}");
}
}
// 4. 更新扩展
bool success = await host.UpdateExtensionAsync("extension-guid");
核心功能
GeneralUpdate.Extension 提供以下核心功能。
扩展主机 (GeneralExtensionHost)
主要的扩展管理容器,提供所有扩展操作的入口点。
| 方法 | 说明 |
|---|---|
| QueryExtensionsAsync() | 从远程服务器查询可用扩展。支持按名称、平台、版本、状态等条件过滤。 |
| UpdateExtensionAsync() | 更新指定扩展。自动处理下载、兼容性检查、平台验证和安装。 |
| DownloadExtensionAsync() | 下载扩展包到指定路径。支持断点续传(HTTP Range 请求)。 |
| InstallExtensionAsync() | 安装扩展包。支持自动回滚功能,安装失败时恢复到之前状态。 |
| IsExtensionCompatible() | 检查扩展与当前主机版本是否兼容。 |
| SetAutoUpdate() | 为指定扩展启用/禁用自动更新。 |
| SetGlobalAutoUpdate() | 启用/禁用所有扩展的全局自动更新。 |
| IsAutoUpdateEnabled() | 检查扩展是否启用自动更新。 |
扩展目录 (ExtensionCatalog)
管理本地已安装扩展的目录,使用 JSON 文件持久化存储。
| 方法 | 说明 |
|---|---|
| LoadInstalledExtensions() | 从 catalog.json 加载已安装的扩展列表。 |
| GetInstalledExtensions() | 获取所有已安装扩展的列表。 |
| GetInstalledExtensionById() | 根据扩展 ID(GUID)获取特定扩展。 |
| GetInstalledExtensionsByPlatform() | 获取支持指定平台的扩展列表。 |
| AddOrUpdateExtension() | 添加新扩展或更新现有扩展的元数据。 |
| RemoveExtension() | 从目录中删除扩展记录。 |
| SaveCatalog() | 将目录保存到 JSON 文件。 |
下载队列 (DownloadQueueManager)
管理扩展下载队列,支持并发下载和状态跟踪。
| 方法 | 说明 |
|---|---|
| EnqueueDownload() | 将下载任务添加到队列。任务将自动排队并处理。 |
| GetDownloadStatus() | 获取指定下载任务的当前状态。 |
| CancelDownload() | 取消正在进行的下载任务。 |
下载队列特性:
- 默认并发下载数:3 个
- 自动状态跟踪(排队、下载中、已完成、失败)
- 支持断点续传
- 事件通知下载状态变化
扩展元数据
每个扩展必须包含以下元数据信息:
| 属性 | 类型 | 说明 |
|---|---|---|
| Id | string | 扩展唯一标识符(GUID 格式) |
| Name | string | 扩展名称(唯一,小写,无空格) |
| DisplayName | string | 人类可读的显示名称 |
| Version | string | 语义化版本号(例如 "1.2.3") |
| Publisher | string | 发布者标识符 |
| Description | string | 扩展描述 |
| SupportedPlatforms | TargetPlatform | 支持的平台标志(Windows/Linux/MacOS/All) |
| MinHostVersion | string | 最低兼容的主机版本 |
| MaxHostVersion | string | 最高兼容的主机版本 |
| Dependencies | string | 依赖的扩展 ID 列表(逗号分隔) |
| Format | string | 文件格式(.dll、.zip 等) |
| Categories | string | 扩展分类(逗号分隔) |
| IsPreRelease | bool | 是否为预发布版本 |
| License | string | 许可证标识符(例如 "MIT"、"Apache-2.0") |
| FileSize | long | 文件大小(字节) |
| Hash | string | 文件哈希值(SHA256) |
| DownloadUrl | string | 下载 URL |
初始化和配置
基本初始化
var options = new ExtensionHostOptions
{
ServerUrl = "https://extensions.example.com/api",
HostVersion = "1.0.0",
ExtensionsDirectory = "./extensions"
};
var host = new GeneralExtensionHost(options);
带身份验证的初始化
var options = new ExtensionHostOptions
{
ServerUrl = "https://extensions.example.com/api",
BearerToken = "your-bearer-token",
HostVersion = "1.0.0",
ExtensionsDirectory = "./extensions",
CatalogPath = "./extensions/catalog.json" // 可选:自定义目录文件路径
};
var host = new GeneralExtensionHost(options);
订阅事件
host.ExtensionUpdateStatusChanged += (sender, e) =>
{
switch (e.Status)
{
case ExtensionUpdateStatus.Queued:
Console.WriteLine($"{e.ExtensionName} 已加入队列");
break;
case ExtensionUpdateStatus.Updating:
Console.WriteLine($"{e.ExtensionName} 更新中... {e.Progress}%");
break;
case ExtensionUpdateStatus.UpdateSuccessful:
Console.WriteLine($"{e.ExtensionName} 更新成功!");
break;
case ExtensionUpdateStatus.UpdateFailed:
Console.WriteLine($"{e.ExtensionName} 更新失败: {e.ErrorMessage}");
break;
}
};
查询远程扩展
基本查询
var query = new ExtensionQueryDTO
{
PageNumber = 1,
PageSize = 20
};
var result = await host.QueryExtensionsAsync(query);
if (result.Success && result.Data != null)
{
Console.WriteLine($"找到 {result.Data.TotalCount} 个扩展");
foreach (var ext in result.Data.Items)
{
Console.WriteLine($"• {ext.DisplayName} v{ext.Version}");
Console.WriteLine($" 发布者: {ext.Publisher}");
Console.WriteLine($" 兼容: {ext.IsCompatible}");
}
}
高级查询(带过滤条件)
var query = new ExtensionQueryDTO
{
Name = "my-extension", // 按名称搜索
Platform = TargetPlatform.Windows, // 只查询 Windows 扩展
HostVersion = "1.0.0", // 检查与此版本的兼容性
Status = true, // 只查询已启用的扩展
BeginDate = DateTime.Now.AddMonths(-1), // 最近一个月的扩展
EndDate = DateTime.Now,
PageNumber = 1,
PageSize = 50
};
var result = await host.QueryExtensionsAsync(query);