feat(modules): 模块系统支持任务/API/UI 扩展
- 新增模块抽象与 manifest/版本范围、安装/启用/停用/回滚\n- 模块管理页面:上传 .tpm/.zip、状态与冲突提示\n- 任务中心/新建任务改为基于模块贡献动态展示(system 不出现在新建列表)\n- API 管理改为基于模块贡献动态创建与通用配置编辑\n- 支持模块扩展任务执行器与扩展页面入口 /ext/{moduleId}/{pageKey}\n\n内置模块:builtin.kick-api、builtin.tasks
This commit is contained in:
1 parent
cfa53eb9b6
commit
09feeed2db
34 files changed
+3063
-129
No files matched your search
@@ -0,0 +1,46 @@
|
||||
using System.Reflection;
|
||||
using System.Runtime.Loader;
|
||||
|
||||
namespace TelegramPanel.Web.Modules;
|
||||
|
||||
public sealed class ModuleLoadContext : AssemblyLoadContext
|
||||
{
|
||||
private readonly AssemblyDependencyResolver _resolver;
|
||||
private readonly string _baseDir;
|
||||
|
||||
public ModuleLoadContext(string mainAssemblyPath) : base(isCollectible: false)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(mainAssemblyPath))
|
||||
throw new ArgumentException("mainAssemblyPath 不能为空", nameof(mainAssemblyPath));
|
||||
|
||||
_resolver = new AssemblyDependencyResolver(mainAssemblyPath);
|
||||
_baseDir = Path.GetDirectoryName(mainAssemblyPath) ?? "";
|
||||
}
|
||||
|
||||
protected override Assembly? Load(AssemblyName assemblyName)
|
||||
{
|
||||
var path = _resolver.ResolveAssemblyToPath(assemblyName);
|
||||
if (!string.IsNullOrWhiteSpace(path) && File.Exists(path))
|
||||
return LoadFromAssemblyPath(path);
|
||||
|
||||
// fallback:如果模块未提供 deps.json,则在 lib 目录按名称寻找
|
||||
var name = (assemblyName.Name ?? "").Trim();
|
||||
if (name.Length == 0 || string.IsNullOrWhiteSpace(_baseDir))
|
||||
return null;
|
||||
|
||||
var candidate = Path.Combine(_baseDir, name + ".dll");
|
||||
if (File.Exists(candidate))
|
||||
return LoadFromAssemblyPath(candidate);
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
protected override IntPtr LoadUnmanagedDll(string unmanagedDllName)
|
||||
{
|
||||
var path = _resolver.ResolveUnmanagedDllToPath(unmanagedDllName);
|
||||
if (!string.IsNullOrWhiteSpace(path) && File.Exists(path))
|
||||
return LoadUnmanagedDllFromPath(path);
|
||||
|
||||
return base.LoadUnmanagedDll(unmanagedDllName);
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user