如何开发NetCore插件
发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要介绍"如何开发NetCore插件",在日常操作中,相信很多人在如何开发NetCore插件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"如何开发NetCore
千家信息网最后更新 2026年11月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(); IEnumerable AssemblyList = 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安全错误
数据库的锁怎样保障安全
互联网与科技
互联网高科技
互联网科技公司的优势
互联网属科技
互联网和科技创新
互联网科技公司税收优惠
互联网扶贫科技
腾讯阿里互联网科技
互联网科技视频
上海喔噻互联网科技
奇酷互联网络科技公司
电子科技大学互联网
青海省互联网新科技
恒银科技与互联网金融
厦门千工互联网科技有限公司
辽宁互联网新科技
银川新华互联网科技学校联系电话
电子商务与互联网科技的关系
青岛易易互联网科技
前海云享互联网科技
互联网科技工作委员会
河南真二互联网科技有限公司
四川狮子座互联网科技
恒生科技互联网指数分析
中国互联网有什么科技含量
南山科技园互联网公司有哪些
山东有哪些互联网科技公司
互联网科技接地气
互联网科技大会大佬
株洲百竞科技的互联网营销顾问