当前位置: 首页 > news >正文

C#DLL热加载|动态替换

我有一个项目 开始取数据和结束数据部分是一样的,但中间处理数据是根据客户需求来转换的

又要求增加一个客户数据转换 主程序是不能停下来的

所以这个项目转数据转换部分做成插件式

每个客户的数据转换都是一个项目 都是一个DLL

主程序里面定义好接口类或者抽象类以约束数据转换项目方法

一:主程序 加载的时候就监听一个文件夹里的DLL 切加载DLL

public static void AgreementDllWatcher()
{string dir = INIConfig.AgreementPath;string[] allDll = Directory.GetFiles(dir, "*.dll");foreach (var fdll in allDll.OrderBy(f => System.IO.File.GetLastWriteTime(f))){LoadDllLoadMenu(fdll);}// 创建FileSystemWatcher对象并设置要监视的目录FileSystemWatcher watcher = new FileSystemWatcher(dir);// 设置监视的文件类型watcher.Filter = "*.dll";// 设置监控的事件类型watcher.NotifyFilter = NotifyFilters.LastWrite| NotifyFilters.FileName| NotifyFilters.DirectoryName;// 监视子目录watcher.IncludeSubdirectories = true;// 定义事件处理器watcher.Created += (source, fsea) =>{// 打印发生的事件Console.WriteLine($"{fsea.FullPath} - {fsea.ChangeType}");Thread.Sleep(5000);LoadDllLoadMenu(fsea.FullPath);};//watcher.Deleted += OnChanged;//watcher.Changed += OnChanged;//watcher.Renamed += OnRenamed;// 只当需要时启动监控watcher.EnableRaisingEvents = true;MainForm.form1.ShowMessage("协议文件夹监控启动。。。");// 关闭监控//watcher.EnableRaisingEvents = false;}
 static List<Type> ListAgreementClass = new List<Type>();private static void LoadDllLoadMenu(string FullPath){try{//动态加载程序集Assembly assembly = Assembly.LoadFile(FullPath);if (assembly != null){{获取程序集中指定的类类型,参数为:命名空间.类型名//var type = assembly.GetType("ConsoleApp2.Xiaoa");创建实例,方法一//var obj = Activator.CreateInstance(type);创建实例,方法二  ,参数为:命名空间.类型名    var obj = assembly.CreateInstance("DynamicReferenceDLL.MyMath");获取实例中的方法//var method = type.GetMethod("e");调用实例方法//object result = method.Invoke(obj, new object[] { });}{//Type t = nameSpaceAll.Where(x => x.Name == tableName.ToString()).FirstOrDefault();  // assembly.GetTypes() //获取当前类库下所有类型//.Where(t => typeof(I_Sl651).IsAssignableFrom(t)) //获取间接或直接继承t的所有类型//.Where(t => !t.IsAbstract && t.IsClass) //获取非抽象类 排除接口继承IEnumerable<Type> wormMain = assembly.GetTypes().Where(t => !t.IsAbstract && t.IsClass);foreach (Type t in wormMain){ListAgreementClass.Remove(ListAgreementClass.Where(c => c.Name == t.Name).FirstOrDefault());ListAgreementClass.Add(t);}//ListAgreementClass.AddRange(wormMain);// m.GetInterface(typeof(I_Sl651).Name) != null);//var tmpObj = (SL651Standard)Activator.CreateInstance(wormMain);//tmpObj.LoadMenu();}}}catch (Exception ex){Logging.SaveLog(ELogLayer.Transfer, ex.ToString(), ELogType.Error);}}

二:热替换

麻烦:在你监控的文件夹里有同名的DLL系统会说占用不让换

解决:将DLL文件名后面加上时间 就可以复制进去了

注意程序里面添加到内存的是 类名 不是我们DLL的文件名,所以做好 list的替换就行

相关文章:

C#DLL热加载|动态替换

我有一个项目 开始取数据和结束数据部分是一样的&#xff0c;但中间处理数据是根据客户需求来转换的 又要求增加一个客户数据转换 主程序是不能停下来的 所以这个项目转数据转换部分做成插件式 每个客户的数据转换都是一个项目 都是一个DLL 主程序里面定义好接口类或者抽象…...

数据库三大范式

目录 第一范式(1NF) 第二范式(2NF) 第三范式(3NF) Oracle三大范式是数据库设计中的规范化过程,旨在减少数据冗余、提高数据一致性和数据库性能。这三大范式包括第一范式(1NF)、第二范式(2NF)和第三范式(3NF)。 第一范式(1NF) 数据库表的每一列都是不可分割…...

【linux】fdisk磁盘分区管理

介绍 fdisk是一个磁盘分区管理工具&#xff0c;可以用来创建、删除、修改和查看磁盘分区。 fdisk一般都是交互式使用&#xff0c;基础语法: fdisk /dev/sdd。进入交互窗口后&#xff0c;有一些选项&#xff0c;需要了解下&#xff1a; 选项含义n创建新分区p查看磁盘的分区情…...

asp.net core 入口 验证token,但有的接口要跳过验证

asp.net core 入口 验证token,但有的接口要跳过验证 在ASP.NET Core中&#xff0c;你可以使用中间件来验证token&#xff0c;并为特定的接口创建一个属性来标记是否跳过验证。以下是一个简化的例子&#xff1a; 创建一个自定义属性来标记是否跳过验证&#xff1a; public clas…...

[mysql]聚合函数GROUP BY和HAVING的使用和sql查询语句的底层执行逻辑

#GROUP BY的使用 还是先从需求出发,我们现在想求员工表里各个部门的平均工资,最高工资 SELECT department_id,AVG(salary) FROM employees GROUP BY department_id 我们就会知道它会把一样的id分组,没有部门的就会分为一组,我们也可以用其他字段来分组,我们想查询不同jb_id…...

从数据中台到数据飞轮:实现数据驱动的升级之路

从数据中台到数据飞轮&#xff1a;实现数据驱动的升级之路 随着数字化转型的推进&#xff0c;数据已经成为企业最重要的资产之一&#xff0c;企业普遍搭建了数据中台&#xff0c;用于整合、管理和共享数据&#xff1b;然而&#xff0c;近年来&#xff0c;数据中台的风潮逐渐减退…...

小记:SpringBoot中,@Alisa和@ApiModelProperty的区别

在 Spring Boot 中&#xff0c;Alias和ApiModelProperty 这两个注解用于不同的目的。 Alias Alias是一个用于定义别名的注解&#xff0c;通常用于 Bean 属性的别名功能&#xff0c;这样在使用某些框架&#xff08;如 JPA 或 Jackson&#xff09;时&#xff0c;可以将一个属性名…...

信捷 PLC C语言 定时器在FC中的使用

传统梯形图的定时器程序写起来简单&#xff0c;本文用C语言写定时器的使用。 定时器在c语言中使用&#xff0c;和普通梯形图中使用的区别之一是既有外部条件&#xff0c;也有内部条件。 1.建全局变量 2.建立FC POU 这个是功能POU程序。 这里的Enable是内部条件 3.调用包含定…...

k8s常用对象简介

Pod Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。 Pod 是一组&#xff08;一个或多个&#xff09; 容器&#xff1b; 这些容器共享存储、网络、以及怎样运行这些容器的声明。 Pod 中的内容总是并置&#xff08;colocated&#xff09;的并且一同调度&…...

【Kaggle | Pandas】练习2:索引,选择和分配

文章目录 数据总表1、读取列2、读取某列的第几行的值3、第一行数据4、读取列中前10个值5、读取索引标签为1 、 2 、 3 、 5和8的记录6、包含索引标签为0 、1 、10和100的记录的country 、province 、 region_1和region_2列7、 前 100 条记录的country和variety列8、包含Italy葡…...

【flask】 flask redis的使用

目的&#xff1a;如何使用在flask web项目中连接redis&#xff0c;并简单的使用 使用的库包&#xff1a;flask-redis pip install falsk-redis下面的写法是对项目代码进行模块化拆分的写法&#xff0c;在app.py中只进行对象的初始化等操作&#xff1b;exts.py中创建对象&…...

【Unity基础】Unity中的特殊文件夹详解

在Unity项目中&#xff0c;通常可以根据需要创建任意名称的文件夹来组织项目内容&#xff0c;但有一些特定的文件夹名称会触发Unity对其中资源和脚本的特殊处理。这篇文章将详细介绍这些特殊文件夹&#xff0c;帮助开发者在项目中合理地使用它们。 1. Assets 文件夹 Assets文…...

矩阵蠕虫,陈欣出品

第一章 陈欣是一名资深的软件工程师&#xff0c;专门从事分布式系统和人工智能的研究。她的最新项目叫做“MatrixWorm”&#xff0c;目标是创建一个简单而强大的远程控制系统。在这个系统中&#xff0c;控制端可以通过文字命令&#xff0c;让被控制端利用大语言模型的能力来理…...

python 爬虫 入门 五、抓取图片、视频

目录 一、图片、音频 二、下载视频&#xff1a; 一、图片、音频 抓取图片的手法在上一篇python 爬虫 入门 四、线程&#xff0c;进程&#xff0c;协程-CSDN博客里面其实有&#xff0c;就是文章中的图片部分&#xff0c;在那一篇文章&#xff0c;初始代码的28&#xff0c;29行…...

ubantu 编译安装ceph 18.2.4

下载ceph代码 git clone https://github.com/ceph/ceph.git #切换tag git checkout v18.2.4 -b v18.2.4 #下载子模块 会有报错重新执行即可 git submodule update --init --recursive安装ceph所需要的依赖 #curl命令安装 sudo apt install curl#安装ceph依赖 ./install-deps.…...

哈希封装“unordered_set·map“

本文与对setmap的封装高度相似&#xff0c;可以参考我之前的对setmap封装的文章&#xff1a; 链接&#xff1a;&#xff08;没看过的话就点点我吧&#x1f61a;&#x1f61a;&#x1f61a;&#x1f61a;&#x1f61a;&#x1f61a;&#x1f61a;&#x1f61a;&#x1f61a;&am…...

Bi-LSTM-CRF实现中文命名实体识别工具(TensorFlow)

项目源码获取方式见文章末尾&#xff01; 回复暗号&#xff1a;13&#xff0c;免费获取600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 **《------往期经典推荐------》**项目名称 1.【MobileNetV2实现实时口罩检测tensorflow】 2.【卫星图像道路检测DeepLabV3P…...

从JDK 17 到 JDK 21:Java 新特性

JDK17 密封类 概念&#xff1a;密封类允许开发者控制哪些类可以继承或实现特定的类或接口。通过这种方式&#xff0c;密封类为类的继承提供了更高的安全性和可维护性。 定义&#xff1a;使用sealed代表该类为密封类&#xff0c;并用permits限制哪些类可以继承。 public sea…...

【计算机网络 - 基础问题】每日 3 题(五十七)

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?typeblog &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞…...

第十二章 章节练习created的应用

目录 一、引言 二、运行效果图 ​三、完整代码 一、引言 构建一个新闻的页面&#xff0c;页面在响应式数据准备好之后&#xff08;即created&#xff09;&#xff0c;就向后台接口请求获取新闻数据列表&#xff0c;然后赋值给Vue实例中的list列表&#xff0c;这个请求逻辑我…...

机器学习在资产管理中的应用:从数据到投资组合的端到端框架

1. 项目概述&#xff1a;当机器学习遇见资产管理如果你在资产管理行业待过&#xff0c;或者对量化投资感兴趣&#xff0c;那你肯定不止一次想过&#xff1a;那些复杂的市场数据、财报、新闻&#xff0c;能不能让机器来帮我们分析&#xff0c;甚至做出决策&#xff1f;firmai/ma…...

锌电池技术解析:长时储能的安全经济新选择

1. 储能技术演进与锌电池的崛起在能源转型的浪潮中&#xff0c;储能系统的角色已经从“锦上添花”变成了“不可或缺的基石”。我们从业者最直观的感受是&#xff0c;早期的储能项目大多围绕“削峰填谷”展开&#xff0c;目标相对单一。但随着可再生能源渗透率的急剧提升&#x…...

告别单调!用LVGL Button控件打造3种高级交互动效(附完整C代码)

用LVGL Button控件实现高级交互动效的实战指南 在嵌入式设备上打造流畅、生动的用户界面一直是开发者的挑战。LVGL作为轻量级图形库&#xff0c;其Button控件的基础功能虽然简单&#xff0c;但通过巧妙运用样式和动画API&#xff0c;可以实现媲美移动端的高级交互效果。本文将深…...

基于MCP协议构建监控数据连接器:统一多源数据赋能AI运维

1. 项目概述&#xff1a;一个面向开发者的监控数据连接器如果你是一名开发者&#xff0c;尤其是后端或运维工程师&#xff0c;那么“监控”这个词对你来说一定不陌生。从服务器CPU、内存使用率&#xff0c;到应用接口的响应时间、错误率&#xff0c;再到业务层面的关键指标&…...

GOAT-PEFT:模块化PEFT工具箱,让大模型微调像搭积木一样简单

1. 项目概述&#xff1a;当大模型遇上“轻量级”微调如果你最近在关注大语言模型&#xff08;LLM&#xff09;的应用落地&#xff0c;尤其是想在有限的算力资源下&#xff0c;让一个像Llama、ChatGLM这样的“庞然大物”学会你的专属知识或特定任务&#xff0c;那么“微调”这个…...

PHP批量导出数据,CSV格式文件 - 支持几十万行数据无压力

目录 一、前言 二、解决方案 三、示例 一、前言 之前做数据批量导出一直都是用的PHPExcel插件&#xff0c;一个是由于现在PHPExcel已经不再维护了&#xff0c;一个是如果导出大批量数据&#xff0c;导出的表格就会提示数据损坏、文件不完整之类的提示&#xff0c;就是打不开…...

开源项目本地化实战:从Presentify翻译项目看国际化协作

1. 项目概述&#xff1a;一个被忽视的开源宝藏如果你是一个经常需要做演示、录屏或者线上教学的开发者、讲师或者知识分享者&#xff0c;那你一定遇到过这个痛点&#xff1a;如何在屏幕上清晰地标注你的鼠标点击、按键操作&#xff0c;让观众能毫不费力地跟上你的思路&#xff…...

可观测性技术栈选型指南:从Prometheus到OpenTelemetry的实践路径

1. 项目概述&#xff1a;一个可观测性技术栈的“藏宝图”如果你正在构建或维护一个现代化的、需要高可靠性的软件系统&#xff0c;那么“可观测性”这个词对你来说一定不陌生。它早已超越了传统的监控&#xff0c;成为确保系统健康、快速定位问题的核心能力。然而&#xff0c;当…...

IGF-I Analog ;CYAAPLKPALSSC

一、基础信息多肽名称&#xff1a;IGF-I Analog 胰岛素样生长因子 I 类似物 三字母序列&#xff1a;Cys-Tyr-Ala-Ala-Pro-Leu-Lys-Pro-Ala-Lys-Ser-Cys 单字母序列&#xff1a;CYAAPLKPALSSC 氨基酸数量&#xff1a;12 aa 结构修饰&#xff1a;分子内二硫键 二硫键配对&#xf…...

基于大语言模型与RAG的AI小说生成:从技术原理到工程实践

1. 项目概述&#xff1a;当AI开始“阅读”与“创作”最近在内容创作和小说爱好者圈子里&#xff0c;一个名为“auto-novel”的项目引起了我的注意。简单来说&#xff0c;这是一个利用人工智能技术&#xff0c;实现从“阅读”现有小说到“模仿创作”新内容的自动化工具。它的核心…...