当前位置: 首页 > 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的替换就行

http://www.lryc.cn/news/471241.html

相关文章:

  • 数据库三大范式
  • 【linux】fdisk磁盘分区管理
  • asp.net core 入口 验证token,但有的接口要跳过验证
  • [mysql]聚合函数GROUP BY和HAVING的使用和sql查询语句的底层执行逻辑
  • 从数据中台到数据飞轮:实现数据驱动的升级之路
  • 小记:SpringBoot中,@Alisa和@ApiModelProperty的区别
  • 信捷 PLC C语言 定时器在FC中的使用
  • k8s常用对象简介
  • 【Kaggle | Pandas】练习2:索引,选择和分配
  • 【flask】 flask redis的使用
  • 【Unity基础】Unity中的特殊文件夹详解
  • 矩阵蠕虫,陈欣出品
  • python 爬虫 入门 五、抓取图片、视频
  • ubantu 编译安装ceph 18.2.4
  • 哈希封装“unordered_set·map“
  • Bi-LSTM-CRF实现中文命名实体识别工具(TensorFlow)
  • 从JDK 17 到 JDK 21:Java 新特性
  • 【计算机网络 - 基础问题】每日 3 题(五十七)
  • 第十二章 章节练习created的应用
  • Unity 游戏性能优化实践:内存管理与帧率提升技巧
  • C++游戏开发详解
  • 三、大模型(LLMs)微调面
  • Flutter升级与降级
  • 分布式并发场景的核心问题与解决方案
  • D - Many Segments 2(ABC377)
  • 数组指针和指针数组的区别
  • 【VUE点击父组件按钮,跳转到子组件】
  • Java列表排序:方法与实践
  • 哈希及其封装实现unordermap和set
  • 在 AMD GPU 上构建解码器 Transformer 模型