如何开发NetCore插件
发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,这篇文章主要介绍"如何开发NetCore插件",在日常操作中,相信很多人在如何开发NetCore插件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"如何开发NetCore
千家信息网最后更新 2025年02月01日如何开发NetCore插件
这篇文章主要介绍"如何开发NetCore插件",在日常操作中,相信很多人在如何开发NetCore插件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"如何开发NetCore插件"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
使用NetCore3.1完成框架基本开发后实际应用于项目,需要保证框架的独立性与项目的个性化, 就需要类似于下图的插件化形式将项目放入框架这个容器中启动,下面开始详细介绍实现步骤
项目dll扫描
在框架根目录创建Plugin文件夹,项目在生成后事件使用copy命令拷贝至Plugin文件夹,框架启动时会扫描该文件夹并进行ShadowCopy到PluginTemplate文件夹中
private static void ScanPlugin() {if (!PluginFolder.Exists) { PluginFolder.Create(); }if (!TempPluginFolder.Exists) { TempPluginFolder.Create(); } TempPluginFolder.Attributes = FileAttributes.Normal & FileAttributes.Directory; PluginFolder.Attributes = FileAttributes.Normal & FileAttributes.Directory;//清理临时文件。foreach (var file in TempPluginFolder.GetFiles("*.dll", SearchOption.AllDirectories)) {try{ File.SetAttributes(file.FullName, FileAttributes.Normal); file.Delete(); }catch (Exception e) {throw new Exception("请检查IIS权限"); } }//复制插件进临时文件夹。foreach (var plugin in PluginFolder.GetFiles("*.dll", SearchOption.AllDirectories)) {try{string CopyFilePath = Path.Combine(TempPluginFolder.FullName, plugin.Name); File.Copy(plugin.FullName, CopyFilePath, true); File.SetAttributes(CopyFilePath, FileAttributes.Normal); }catch (Exception e) {throw new Exception("请检查IIS权限"); } } }
项目dll加载
直接使用ApplicationParts加载AssemblyPart即可
public static void LoadPlugin() { ScanPlugin(); IEnumerableAssemblyList = GetPluginAssemblies();foreach (Assembly assembly in AssemblyList) {foreach (var type in assembly.GetTypes()) {if (type.IsAssignableFrom(typeof(Controller)) && type.Name.Contains("Controller") && type.IsClass && !type.IsAbstract) {string Name = type.Name;//如果有自定义的路由注解if (type.IsDefined(typeof(Route), false)) {var areaattribute = type.GetCustomAttributes(typeof(Route), false).FirstOrDefault(); Name = ((Route)areaattribute).Name; Name += "Controller"; }if (!ControllerTypeDic.ContainsKey(Name)) { ControllerTypeDic.Add(Name, type); } } }var controllerAssemblyPart = new AssemblyPart(assembly); CloudUtil.GetBuilder().ConfigureApplicationPartManager(apm =>{ apm.ApplicationParts.Add(controllerAssemblyPart); }); } CloudUtil.GetBuilder().SetCompatibilityVersion(CompatibilityVersion.Version_3_0); StartPluginRefreshWatch(); }
项目视图
项目的cshtml视图文件可以手动拷贝到部署的框架Views文件夹中(正式环境),也可以通过监控当前项目的Views文件夹,如果变动进行自动拷贝(开发环境)
private static void StartPluginRefreshWatch() { _FileSystemWatcher.Path = CloudUtil.GetContentPath() + "/Plugin"; _FileSystemWatcher.Filter = "*.dll"; _FileSystemWatcher.Changed += _FileSystemWatcher_Changed; _FileSystemWatcher.IncludeSubdirectories = true; _FileSystemWatcher.NotifyFilter =NotifyFilters.Attributes | NotifyFilters.CreationTime | NotifyFilters.DirectoryName | NotifyFilters.FileName | NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.Security | NotifyFilters.Size; _FileSystemWatcher.EnableRaisingEvents = true;if (AppConfigUtil.Configuration["Frame:ViewsPublishType"]=="AutoCopy"&& !string.IsNullOrEmpty(AppConfigUtil.Configuration["Frame:ViewsVirtualPath"]) && Directory.Exists(AppConfigUtil.Configuration["Frame:ViewsVirtualPath"])) { FileSystemWatcher ViewsWatcher = new FileSystemWatcher(); ViewsWatcher.Path = AppConfigUtil.Configuration["Frame:ViewsVirtualPath"]; ViewsWatcher.Changed += ViewsWatcher_Changed; ViewsWatcher.IncludeSubdirectories = true; ViewsWatcher.NotifyFilter =NotifyFilters.Attributes | NotifyFilters.CreationTime | NotifyFilters.DirectoryName | NotifyFilters.FileName | NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.Security | NotifyFilters.Size; ViewsWatcher.EnableRaisingEvents = true;//系统启动时整个文件夹拷贝DirectoryInfo FrameWorkViews = new DirectoryInfo(CloudUtil.GetContentPath() + "/Views"); DirectoryInfo ProjectViews = new DirectoryInfo(AppConfigUtil.Configuration["Frame:ViewsVirtualPath"]);foreach (DirectoryInfo FDir in FrameWorkViews.GetDirectories()) {foreach (DirectoryInfo PDir in ProjectViews.GetDirectories()) {if (PDir.Name== FDir.Name) { FileUtil.DeleteDirectoryContent(FDir.FullName); } } } FileUtil.CopyDirectory(AppConfigUtil.Configuration["Frame:ViewsVirtualPath"],CloudUtil.GetContentPath() + "/Views", true); } }
项目dll热更新
监控Plugin文件夹,若有变调用IApplicationLifetime的StopApplication重启系统
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IConfiguration configuration, Microsoft.AspNetCore.Hosting.IApplicationLifetime applicationLifetime) { CloudUtil.SetAPP(applicationLifetime); } private static void _FileSystemWatcher_Changed(object sender, FileSystemEventArgs e) { CloudUtil.Restrat(); } public static void Restrat() { APP.StopApplication(); }
到此,关于"如何开发NetCore插件"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!
文件
文件夹
项目
插件
开发
框架
拷贝
学习
更多
权限
环境
系统
视图
帮助
检查
监控
实用
接下来
下图
个性
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
苏州电翼通网络技术有限公司
互联网高清科技
个人nas服务器安全
舟山嵌入式软件开发需要学什么
软件开发 接口设计
t3数据库安装流程
ipad怎么代理服务器
商品 条形码数据库
构建人力资源数据库系统
订单数据库e-r图的设计
博雅数据库河北文史投档
电脑搭建服务器需要什么
文字识别系统中数据库表的设计
互联网与科技公司
数据库的fk
长江委网络安全事件分为三级
学生管理数据库流程图
2022校园网络安全工作方案
中甲数据库
阿里云服务器 php环境
我的世界怎样恢复服务器
oracle数据库选择填空题
服务器uid按键是什么意思
北京服务器托管公司
公寓装路由器开的网络安全吗
安阳市宏鹏软件开发有限公司
重庆方奥软件开发有限公司
口袋奇兵服务器部署
服务器机房安全保证
网络安全课之三