架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 25486|回复: 9

[资料] .NET 插件的“动态替换”

[复制链接]
发表于 2021-8-15 21:55:14 | 显示全部楼层 |阅读模式
设想这样一种场景:我们的服务系统提供一系列的功能服务,而以后会有更多新的功能服务增加进来,也可能出现功能服务需要被更改或移除的情况。对于这样的服务系统,一个常见的基本的要求就是,在添加/移除/更新功能服务的时候不能停止的服务系统的运行。通常,将每一项服务封装成一个插件Dll,可以非常容易地实现“插件热插拔”,但是插件的“热替换”(“动态替换”)却成了一个问题。原因在于,当我们从服务系统中卸载插件Dll的时候,实际上服务系统仍然持有该Dll的底层引用,这时如果你尝试删除或覆盖这个Dll,windows就会给出类似“该Dll正在被使用”的信息。

那么如何解决这个问题了?我觉得至少有两种方案:

(1)使用AppDomain。在一个新的AppDomain中加载插件,然后通过卸载这个AppDomain就可以干净地从服务系统中卸载该AppDomain中的插件Dll。这种方案的缺陷是需要管理众多的AppDomain(因为你有众多的功能服务),而且跨AppDomain的通信都是以Remoting的方式进行的,这将为我们的系统引入不少本不必要的麻烦。如果你有兴趣也可以尝试一下这种方案,而我更喜欢用第二种。

(2)在内存中复制插件Dll,然后加载内存中的Dll。这样,硬盘上的Dll就可以随意地被覆盖或删除了。以前我们是直接从硬盘加载插件Dll,就像这样:

现在,我们需要转个弯:


这样就解决了插件的“动态替换”的问题。





上一篇:【实战】Spring Cloud 记录所有请求接口日志至 MongoDB
下一篇:.NET/C# 将下划线字段名转换成大驼峰形式
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2021-8-15 23:11:28 | 显示全部楼层
这么大项目 还是晚上重启下服务器好了。。。。
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2021-8-17 14:43:41 | 显示全部楼层
感谢分享!~`
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2021-9-16 18:25:58 | 显示全部楼层
测试回复
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2021-9-17 21:39:18 | 显示全部楼层
学习一下
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2021-9-18 19:05:29 | 显示全部楼层
本帖最后由 fyxh66 于 2021-9-18 19:07 编辑

System.BadImageFormatException:“未能加载文件或程序集“12505088 bytes loaded from 3.3hook, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”或它的某一个依赖项。试图加载格式不正确的程序。”IL 格式不正确。
  • var dll = Assembly.Load(addinStream);
86也试过了,不行@小渣渣 老大有空帮忙看看
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2021-9-18 22:08:32 | 显示全部楼层
fyxh66 发表于 2021-9-18 19:05
System.BadImageFormatException:“未能加载文件或程序集“12505088 bytes loaded from 3.3hook, Version=1 ...

没遇到过这个问题。

出现System.BadImageFormatException 异常有两种情况:程序目标平台不一致&引用dll文件的系统平台不一致。

检查:主程序和插件dll的.net版本是否一致,还有目标平台是否一致,或则 dll 并不是 .net 开发的?
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2021-9-19 16:17:56 | 显示全部楼层
小渣渣 发表于 2021-9-18 22:08
没遇到过这个问题。

出现System.BadImageFormatException 异常有两种情况:程序目标平台不一致&引用dll ...

对, c++的dll...
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2021-9-19 17:01:33 | 显示全部楼层

那肯定不行啊,这里的动态插件只能加载 .net 的 dll,调用 c++ 的 dll 不是这样调的
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2021-9-19 18:54:53 | 显示全部楼层
小渣渣 发表于 2021-9-19 17:01
那肯定不行啊,这里的动态插件只能加载 .net 的 dll,调用 c++ 的 dll 不是这样调的 ...

调c++的dll有没有什么能够直接使用dll的byte[]字节集来调用里面方法的办法?
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2024-4-25 19:36

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表