博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
插件的“动态替换”
阅读量:4359 次
发布时间:2019-06-07

本文共 968 字,大约阅读时间需要 3 分钟。

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

    那么如何解决这个问题了?我觉得至少有两种方案:
(1)使用AppDomain。在一个新的AppDomain中加载插件,然后通过卸载这个AppDomain就可以干净地从服务系统中卸载该AppDomain中的插件Dll。这种方案的缺陷是需要管理众多的AppDomain(因为你有众多的功能服务),而且跨AppDomain的通信都是以Remoting的方式进行的,这将为我们的系统引入不少本不必要的麻烦。如果你有兴趣也可以尝试一下这种方案,而我更喜欢用第二种。
(2)在内存中复制插件Dll,然后加载内存中的Dll。这样,硬盘上的Dll就可以随意地被覆盖或删除了。以前我们是直接从硬盘加载插件Dll,就像这样:

Assembly asm = Assembly.LoadFrom(addinFilePath) ;   

    现在,我们需要转个弯:

                Assembly asm  = null ;  
               
                //先将插件拷贝到内存缓冲
                byte[] addinStream = null ;                    
                if(FileHelper.ReadFileToBuff(addinFilePath ,out addinStream))
                {
                    asm = Assembly.Load(addinStream) ; //加载内存中的Dll
                }

    

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

 

来源于

http://www.cnblogs.com/zhuweisky/archive/2005/12/30/308218.html

转载于:https://www.cnblogs.com/yxhblog/p/7273009.html

你可能感兴趣的文章
html header标签什么时候用,html中header标签如何使用
查看>>
ado.net(增删改)
查看>>
saltsack自动化配置day01:数据系统-Pillar
查看>>
数据结构学习
查看>>
记一次 调节有音量界面 上移的bug
查看>>
Android IPC系列(二):AIDL源码分析
查看>>
WebAssembly进阶系列一:WebAssembly是什么
查看>>
java 面试
查看>>
【译】ObjectBox官方文档(5)——自定义类型
查看>>
[译] 多网站项目的 CSS 架构
查看>>
LeetCode 67. Add Binary【个位补0,不必对齐】【easy】
查看>>
jsk
查看>>
提问的艺术
查看>>
209. Minimum Size Subarray Sum【滑动窗口】
查看>>
三步翻转法
查看>>
WebServer Project-01-反射
查看>>
TCP粘包和拆包的处理方案
查看>>
567. Permutation in String【滑动窗口】
查看>>
WebServer Project-02-XML解析
查看>>
netty实现websocket客户端(附:测试服务端代码)
查看>>