用C#动态装卸DLL文件

上一个以前用过项目中的简化案例,
为了控制进程间通讯,实际情况要复杂的多:

 

[1]接口

 

[2]dll文件

 

[3]主域

 

//

输出:
// Begin!
// My name is addin-01!
// F:/开发项目/临时区间/SolutionNew/Test/bin/Debug/MyAddin.dll删除成功!
如果你对对布式对象有一定的了解,实现这种“动态插件”的方案并不困难,
做一些补充和说明:
一般情况下,插件应该满足的条件(当然,还有再包装的技术,本质上还是一样的):
[1]继承MarshalByRefObject
[2]参数类型及返回值的类型是可序列化的

得弄清楚三种对象的概念
[1]本地对象:
.net对象在默认情况下是本地的,在创建对象的进程之处,普通的对象是不能被访问的。
[2]固定对象:
对象从不移动,对象总是按引用传递的,通过这个引用,其它计算机可以与对象进行交互。
[3]不固定对象:
对象可以在进程音或计算机间按值传递,对象从原来的进程或计算机被复制到其他的进程或计算机上。
总体思路:
[1]根源:Assembly类有天然的缺陷,就是没有UnLoad操作。
[2]方案:替代品,AppDomain中有UnLoad操作。
[3]本质:进程中的不同的AppDomain之间的通信,其实是基于Remoting的,我的案例中虽然没有出现Remoting
其实在这里被隐藏了:
IAddin myAddin = (IAddin)appDomainOfAddin.CreateInstanceFromAndUnwrap(pathNameOfAddin, "MyAddin.Addin");
CreateInstanceFromAndUnwrap语句就是实现两个程序域之间通讯的关键,本质上还是Remoting的方案。
因为Loader类是在主程序域中,RemoteLoader类则是在子程序域中。实际上是在主程序域中调用Addin的。
因此须要使用代理的方式,来获得对象的引用,就是上述的[2]固定对象方式,
[4]基于Remoting本身的要求(下面稍作解释),得到上述的两个要求:
A:继承MarshalByRefObject
B:参数类型及返回值的类型是可序列化的
关于Remoting
[1].NET FRAMEWORK包括REMOTING子系统,使得.NET应用程序可以交互,当然包括域。
[2]Remoting依赖于“固定对象”和“不固定对象”两个概念
[3]Remoting有上下文的概念,包括以下概念:Channel/格式化/listener/对象代理和位置透明机制
注意:表面上是跑题了,实际上只要有了Remoting的概念,实现这种“插件”机制真的是非常容易理解的。
最后,建议看一本书书
《VB.NET业务对象专家指南》
只要通读全书,这种插件机的实在是小菜一碟了~~
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值