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的替换就行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/58213.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nginx+Tomcat 动静分离

1. NginxTomcat 环境 Nginx 处理静态资源的优势同样可以应用在 Tomcat 环境中 。从实现方法上来说&#xff0c;NginxTomcat 环境的搭建思路与前面完成的 NginxApache 环境是完全相同的&#xff0c;只需要将 Nginx 与 Tomcat 的站点文档目录配置到同一目录下&#xff0c;利用 N…

什么是SMO算法

SMO算法&#xff08;Sequential Minimal Optimization&#xff09; 是一种用于求解 支持向量机&#xff08;SVM&#xff09; 二次规划对偶问题的优化算法。它由 John Platt 在 1998 年提出&#xff0c;目的是快速解决 SVM 的优化问题&#xff0c;特别是当数据集较大时&#xff…

npm安装过程的问题

报错信息C:\Users\lyyds>npm list -global npm error code ENOENT npm error syscall lstat npm error path D:\nodejs\node_global npm error errno -4058 npm error enoent ENOENT: no such file or directory, lstat D:\nodejs\node_global npm error enoent This is rel…

数通自学——VLAN虚拟局域网,eNSP实验讲解

VLAN虚拟局域网&#xff0c;eNSP实验讲解 一、概念二、eNSP仿真实验1、实验一&#xff1a;vlan演示&#xff08;交换机端口access模式&#xff09;2、实验二&#xff1a;vlan演示&#xff08;交换机端口trunk模式&#xff09; 一、概念 VLAN&#xff08;Virtual Local Area Ne…

HarmonyOS应用开发者中级认证——中级闯关习题参考答案大全

文章目录 HarmonyOS第一课 ArkUI进阶判断题单选题多选题 HarmonyOS第一课 应用程序框架进阶判断题单选题多选题 HarmonyOS第一课 合理使用动画和转场判断题单选题多选题 HarmonyOS第一课 Web组件和WebView判断题单选题多选题 HarmonyOS第一课 给应用添加通知和提醒判断题单选题…

SQL-lab靶场less1-4

说明&#xff1a;部分内容来源于网络&#xff0c;如有侵权联系删除 前情提要&#xff1a;搭建sql-lab本地靶场的时候发现一些致命的报错&#xff1a; 这个程序只能在php 5.x上运行&#xff0c;在php 7及更高版本上&#xff0c;函数“mysql_query”和一些相关函数被删除&#xf…

java中的二叉树

二叉树 树型结构概念相关概念树的表示形式树的应用 二叉树概念两种特殊的二叉树二叉树的性质二叉树的存储二叉树的基本操作前置说明二叉树的遍历二叉树的基本操作 二叉树相关OJ题 树型结构 概念 树是一种非线性的的数据结构&#xff0c;它是由n(n>0)个有限结点组成一个具有…

贵州鑫宏远农业-始终致力于推动现代农业的科技创新与发展

贵州鑫宏远农业科技有限公司&#xff0c;是一家在高科技农业领域深耕细作、锐意进取的企业。自成立以来&#xff0c;我们始终致力于推动现代农业的科技创新与发展&#xff0c;业务全面覆盖农业科学研发、组织培养生产、专业育苗培植、半成品及成品精细化养护、市场销售以及全方…

数组与 ArrayList 有什么区别?

数组是一种基本的数据结构&#xff0c;在 Java 中&#xff0c;数组是一段连续的内存空间&#xff0c;用来存储固定数量的同类型元素。 数组的大小在创建时确定&#xff0c;并且在之后不可改变。 特点&#xff1a; 固定大小&#xff1a;数组的长度是固定的&#xff0c;一旦创…

RPA技术重塑企业自动化的未来

1. RPA定义与原理 1.1 机器人流程自动化(RPA)概念 机器人流程自动化&#xff08;Robotic Process Automation&#xff0c;简称RPA&#xff09;是一种软件技术&#xff0c;通过模拟人类用户在计算机界面上的操作来执行重复性的业务流程任务。RPA软件机器人能够自动执行基于规则…

对比两个el-table,差异数据突显标记

前言 在数据分析和数据处理的过程中&#xff0c;经常需要对比两个数据集&#xff0c;以便发现其中的差异和变化。本文将介绍如何使用 el-table 组件来对比两个数据集&#xff0c;并通过差异数据的突显标记&#xff0c;帮助用户更直观地理解数据的变化。 cell-style 属性 其实利…

如何用 obdiag 排查 OceanBase数据库的卡合并问题——《OceanBase诊断系列》14

1. 背景 卡合并在OceanBase中是一个复杂的问题&#xff0c;其产生可能源于多种因素。目前&#xff0c;对于卡合并的明确界定尚不存在统一标准&#xff0c;一方面&#xff0c;我们界定超过36小时未完成合并为合并超时&#xff0c;此时RS会记录ERROR日志&#xff1b;另一方面&am…

4个硬盘数据修复攻略:让你的数据失而复得。

据统计&#xff0c;在硬盘数据丢失的情况当中&#xff0c;有7成是因误删除、格式化和病毒攻击导致的。并且对与很多人来说&#xff0c;数据丢失是一个不小的问题。今天我就给大家分享几款能够帮助硬盘恢复数据的工具&#xff0c;希望能够在数据丢失是减小大家的焦虑。 1、福昕硬…

mac nwjs程序签名公证(其他mac程序也一样适用)

为什么需要公证 mac os14.5之后的系统&#xff0c;如果不对应用进行公证&#xff0c;安装&#xff0c;打开&#xff0c;权限使用上都会存在问题&#xff0c;而且有些问题你强制开启&#xff08;sudo spctl --master-disable&#xff09;使用后可能会有另外的问题&#xff0c; …

Python+pytest接口自动化之session会话保持的实现

前言 在接口测试的过程中&#xff0c;经常会遇到有些接口需要在登录的状态下才能请求&#xff0c;否则会提示请登录&#xff0c;那么怎样解决呢&#xff1f;我们可以通过Cookie绕过登录&#xff0c;其实这就是保持登录状态的方法之一。那么今天笔者想讲通过session进行会话保持…

衡石分析平台系统分析人员手册-导入图表库图表

导入图表库图表​ 本文讲述在仪表盘中如何使用图表库图表&#xff0c;如果您还不了解图表库&#xff0c;请先点击链接了解它的功能和作用。 在数据集市中建立图表库后&#xff0c;分析人员可以在应用创作中引用图表库图表&#xff0c;快速的进行数据分析工作。 导入图表库图…

java第三天(游戏开发)

学到 双缓存机制 public void paint(Graphics g) {// super.paint(g);//createImage(width, height) 是一个方法调用&#xff0c;它创建了一个指定宽度和高度的空图像缓冲区。这个方//法可以在 Component 类中找到&#xff0c;因此任何从 Component 继承的类&#xff08;比…

Unix:Linux的“祖师爷”

目录 Unix的诞生 Unix对Linux的深远影响 Unix与Linux区别在哪里&#xff1f; Unix的诞生 Unix操作系统诞生于1969年&#xff0c;由肯汤普逊&#xff08;Kenneth Lane Thompson&#xff09;和丹尼斯里奇&#xff08;Dennis MacAlistair Ritchie&#xff09;在AT&T的贝尔实…

牛客周赛 Round 65

文章目录 超市思路&#xff1a;Solved&#xff1a; 雨幕思路&#xff1a;Solved&#xff1a; 闺蜜思路&#xff1a;Solved&#xff1a; 医生思路&#xff1a;Solved&#xff1a; 降温&#xff08;easy&#xff09;思路&#xff1a;Solved&#xff1a; F-降温&#xff08;hard&a…

iOS Swift逆向——被编译优化后的函数参数调用约定修复

头文件导入&#xff1a; typedef long long s64; typedef unsigned long long u64;typedef s64 Int; typedef u64 Bool;struct Swift::String {u64 _countAndFlagsBits;void *_object; };union Swift_ElementAny {Swift::String stringElement; };struct Swift_Any {Swift_Ele…