模块系统:支持任务/API/UI 扩展与示例模块
- 增加模块加载隔离与依赖解析,避免类型身份不一致 - 模块管理:安装/启用/停用/删除与回滚 - 新建任务:支持模块自定义编辑器草稿回传(修复提交提示‘请先完善任务配置’) - 新增示例模块:用户任务‘批量订阅/加群’与打包脚本
This commit is contained in:
1 parent
d9580070ac
commit
58c9de9017
13 files changed
+415
-332
No files matched your search
@@ -19,12 +19,32 @@ public sealed class ModuleLoadContext : AssemblyLoadContext
|
||||
|
||||
protected override Assembly? Load(AssemblyName assemblyName)
|
||||
{
|
||||
var name = (assemblyName.Name ?? "").Trim();
|
||||
if (name.Length == 0)
|
||||
return null;
|
||||
|
||||
// 1) 与宿主共享的“边界程序集”必须由 Default ALC 解析,避免同名程序集被模块再次加载导致类型身份不一致。
|
||||
// 典型问题:模块包携带 Microsoft.Extensions.DependencyInjection*.dll / Microsoft.AspNetCore.Components.dll,
|
||||
// 会让 IServiceCollection / EventCallback 等类型在不同 ALC 中变成“不同类型”,最终出现:
|
||||
// - TypeLoadException(看起来像模块没有实现 ConfigureServices)
|
||||
// - 组件参数绑定失败(表现为 DraftChanged 不生效)
|
||||
if (name.StartsWith("Microsoft.Extensions.", StringComparison.OrdinalIgnoreCase)
|
||||
|| name.StartsWith("Microsoft.AspNetCore.", StringComparison.OrdinalIgnoreCase)
|
||||
|| name.StartsWith("Microsoft.JSInterop", StringComparison.OrdinalIgnoreCase)
|
||||
|| name.StartsWith("TelegramPanel.", StringComparison.OrdinalIgnoreCase)
|
||||
|| string.Equals(name, "MudBlazor", StringComparison.OrdinalIgnoreCase))
|
||||
return null;
|
||||
|
||||
// 2) 其次:如果宿主已经加载过同名程序集,则同样交给 Default ALC(避免重复加载)。
|
||||
if (AssemblyLoadContext.Default.Assemblies.Any(a =>
|
||||
string.Equals(a.GetName().Name, name, StringComparison.OrdinalIgnoreCase)))
|
||||
return null;
|
||||
|
||||
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;
|
||||
|
||||
|
||||
Reference in new issue
Block a user