- 兼容
Swashbuckle.AspNetCore生成Swashbuckle.AspNetCore.SwaggerGen.SwaggerGeneratorException: Failed to generate Operation for action - Controllers.PluginsController.Upload (PluginCore.AspNetCore) as [FromForm] attribute used with IFormFile.
- Log: {pluginKey}: 更新
- plugin:startup->appstart
- PackageReference: PluginCore: 2.2.4 -> 2.2.5
- 支持插件间共享 dll 不同版本
- dll 忽略版本搜索
- fixed(
PluginCoreStartupExtensions)- Log Plugin 输出不全
_serviceProvider在AddPluginCore后重新赋值
PackageReference:PluginCore:2.2.3->2.2.4
LogUtil: addLogCategoryName
PluginCore Admin认证与授权- Breaking Change: PluginCore.Admin 不再为默认认证方案, 认证方案名:
PluginCore.Admin.Authentication AccountManager部分方法静态化, 新增传参 HttpContext 方式调用
- Breaking Change: PluginCore.Admin 不再为默认认证方案, 认证方案名:
LogUtil与 依赖注入ILogger结合- 日志输出: 中文 -> 英文
- 插件:
启用,禁用:Message: 使用BasePlugin源 - License:
Apache-2.0->GNU LGPLv3 - PackageReference:
PluginCore: 2.2.2 -> 2.2.3 ,PluginCore.IPlugins.AspNetCore: 0.1.0 -> 0.1.1
LogUtil与 依赖注入ILogger结合- License:
Apache-2.0->GNU LGPLv3 - PackageReference:
PluginCore.IPlugins: 0.9.0 -> 0.9.1
- License:
Apache-2.0->GNU LGPLv3 - PackageReference:
PluginCore.IPlugins: 0.9.0 -> 0.9.1
- License:
Apache-2.0->GNU LGPLv3 - added:
Constants.cs:PluginCore.IPlugins.Constants
<PackageReference Include="PluginCore" Version="2.2.2" />: 2.2.1 -> 2.2.2
PositivePluginLoadContext- pluginMainDllFilePath 被锁定, 释放前无法再次通过
AssemblyName.GetAssemblyName(pluginMainDllFilePath)打开
- pluginMainDllFilePath 被锁定, 释放前无法再次通过
services.TryAddTransient<PluginFinderV1>();services.TryAddTransient<PluginFinderV2>();services.TryAddTransient<PluginFinder>();services.TryAddTransient<IPluginFinder, PluginFinder>();
PluginFinderV1- 依赖解析:
IServiceProvider - 不要在后台线程上捕获注入控制器的服务
- 依赖解析:
PluginFinderV2- 依赖解析:
IServiceScopeFactory - 后台线程使用此服务
- 依赖解析:
PluginFinderPluginFinder : PluginFinderV2
PluginCore.IPlugins.AspNetCore-v0.1.0
PluginCore.IPlugins-v0.9.0
PluginCore-v2.2.0- 简化 插件状态
- 移除
未安装状态 - 上传后 默认为
未启用 Plugins文件夹中仅有两种状态的插件:已启用,未启用
- 移除
PluginCore.IPlugins-v0.9.0IPluginFinder新 API
IPlugins.AppStart()IPlugins.AppStartOrderDependPlugins
DebugController:PluginContexts:PluginId<PackageReference Include="PluginCore" Version="2.1.0" />
- 修复解压时没有子目录导致解压失败的问题
IPluginContext.PluginIdLazyPluginLoadContext,PositivePluginLoadContext
api/PluginCore/Admin/DebugPluginContextsAssemblyLoadContextsAssembliesServices
- 使用
PluginCore-v2.0.2
- B 插件依赖 A 插件时, B 插件无法启用
- 1.null异常: B 插件的 LoadContext 没有搜索到 A 插件的 assemblyName
- 2.经过测试启用, 不同版本 dll 依然可以在不同插件中共存 (由于1插件一个LoadContext, 区分采用
AssemblyName.FullName)
- 内存溢出
- 后台定时任务频率太高 (1s), GC 没有及时回收, 内存++ -> 每次任务完成
GC.Collect()
- 后台定时任务频率太高 (1s), GC 没有及时回收, 内存++ -> 每次任务完成
- 后端: 移除: 插件上传大小限制
- 前端: 使用
plugincore-admin-frontend-v0.3.2- 移除: 插件上传大小限制
- 更新到
PluginCore-v2.0.1
- 修复 插件dll 被锁定 导致的删除失败
- 默认 使用 最新 微软推荐的 插件加载方案
PluginLoadContext - 大量接口变更, 类名变更
- 默认 使用 最新 微软推荐的 插件加载方案
PluginLoadContext - 大量接口变更, 类名变更
- 修复由于
GitHub Action缺少npm install引起的 没有将前端文件打包进入 dll
- 修复由于
GitHub Action引起 没有安装Node.js导致没有成功npm install最终导致没有将前端文件成功打包进入 dll
services.TryAddTransient<IPluginFinder, PluginFinder>();
- 仅
ASP.NET Core相关
PS: 注意: 之前的
PluginCore.AspNetCore-0.0.1无用, 只是为了占用住 在 NuGet 的 PackageId
- 仅
ASP.NET Core相关
- 重大更新: 重构
- 在
ASP.NET Core中的内容移动到PluginCore.AspNetCore - 接口更新
- 在
- 开放更多接口, 可自由替换内部实现
services.TryAddTransient<IPluginControllerManager, PluginControllerManager>();services.TryAddTransient<IPluginApplicationBuilderManager, PluginApplicationBuilderManager>();services.TryAddTransient<IPluginManager, AspNetCorePluginManager>();services.AddTransient<IPluginFinder, PluginFinder>();- 注意: 此项忘记 用
TryAdd了, 在AddPluginCore()前 添加会导致无法替换内部, 下个版本修复
- 注意: 此项忘记 用
- 重大更新: 重构
- 在
ASP.NET Core中的内容移动到PluginCore.IPlugins.AspNetCore
- 在
- 更新 PluginCore Admin 前端:
plugincore-admin-frontend-v0.3.1- Fixed: 用户名验证错误
tokenCookieName = "PluginCore.Admin.Token"与PluginCore Admin前端一致, 而不是后端检索tokenCookieName = "token"- 插件可在
Controller,Action上使用[Authorize("PluginCoreAdmin")], 来达到与PluginCore Admin相同的权限策略
- 插件可在
ITimeJobPlugin多线程定时任务 执行问题- 当上一个任务未完成, 下个任务就开始时导致, 修复: 加锁, 下个任务线程阻塞等待
- 挂件 (Plugin Widget) 相关
PluginCore.IPlugins.IWidgetPlugin.Widget前端挂件接口
- 若
PluginCore+Swashbuckle.AspNetCore配合使用, 导致SwaggerGeneratorException: Ambiguous HTTP method for action
- Reference: plugincore-admin-frontend v0.3.0
- PackageReference: PluginCore.IPlugins: 0.6.1
- remove:
Newtonsoft.Json- 设置的json格式化 使用
System.Text.json
- 设置的json格式化 使用
- 当
主程序 打包进入 1个dll 或 1个exe可能导致 插件重复引入 主程序已引入Assembly
- nuget 包中
PluginCore.dll缺失Resources导致 #7
-
用户头像 在某些时候url错误: 改为完全由前端提供
-
RemoteFrontend 已更新
ITimeJobPlugin定时任务 激活
- 命名空间 整理
ITimeJobPlugin定时任务
- 命名空间 整理
IPluginFinder添加,并注入服务ConfigureServicesOrder,ConfigureOrder添加,ConfigureOrder应用
IPluginFinder注入服务
PluginApplicationBuilderManager- 性能提升: 不再是每次在 middleware.invoke 时 build插件的middleware, 而是启用禁用时rebuild
IStartupXPlugin支持在运行时添加请求管道Middleware, 热插拔 ( 实验阶段 )- 不同于
IStartupPlugin必须启用后,重启站点
- 不同于
- 激活
IStartupXPlugin的Configure(IApplicationBuilder app)- 支持在运行时添加
请求管道Middleware, 热插拔 ( 实验阶段 ) - 不同于
IStartupPlugin必须启用后,重启站点 - 暂不支持
ConfigureServices(IServiceCollection services)
- 支持在运行时添加
-
当插件引用dll时, 插件Controller立即使用引用dll时,报错:找不到引用dll
- 改变加载dll顺序: 先加载插件引用的dll, 再加载插件主dll
-
插件启用: 内部顺序 引起的插件未成功启用,但配置文件却已改变
- IStartupPlugin 激活,进入实验阶段
- 实现
IStartupPlugin的插件 安装后,需先启用,再重启站点,即可激活IStartupPlugin, 此类插件无法热插拔
- 实现
- 插件sdk
- 新的api
- 插件sdk
- 新的api
- 前端内嵌式资源 改为使用 npm, 不再使用
PluginCoreAdmin, 只有LocalFolder模式才使用此文件夹
- 支持 嵌入式资源 方式引入前端
- PluginCore.Config.json 部分配置属性 改变
- PluginCore.Config.json 前端配置 改为 前端模式 (
FrontendMode)
- PluginCore.Config.json 前端配置 改为 前端模式 (
- plugin 支持加载插件 wwwroot 文件夹下的 html前端等
- System.InvalidOperationException: No authenticationScheme was specified, and there was no DefaultChallengeScheme found. The default schemes can be set using either AddAuthentication(string defaultScheme) or AddAuthentication(Action configureOptions).
- Fixed #4
- plugin 支持加载插件 wwwroot 文件夹下的 html前端等
- 支持加载远程前端, 使用 jsdelivr
- IPlugin
- BasePlugin
- 基本 辅助类
- 加载本地 前端