C#丢弃Appdomain 之 动态dll替换

本文探讨了在C#中如何处理引用DLL的卸载问题,指出Appdomain虽是解决方案但存在性能损失和不便。通过示例展示了一个利用AssemblyResolve事件重定向程序集的方法,演示了动态加载与替换DLL的过程,强调通过修改DLL版本号实现程序集的更新,以达到在运行时动态更新代码的效果。
摘要由CSDN通过智能技术生成
    好久没写什么了,最近项目遇到一要求,为开发方便,需要wcf 服务能动态加载。这本不是什么难事,反射内存加载大家都会。

     但是,如果遇到引用DLL?如何卸载被引用的程序集,基本上陷入困境。

网上资料无非 appdomain能解决。但是,不算性能损失,调用方式不便。

这种繁琐的解决方案,估计也不会经常在项目中实施,除非非它不可。

当然,一开始就注重设计,引入工厂容器进行对象管理之类项目排除。

这里,我们来演示一个小小的项目,或许,对你有所帮助。

     

首先要说的是:AssemblyResolve

   当你尝试用Assembly.Load载入一个程序集,并且尝试运行其中方法的时候。如果遇到引用另外一个程序集的情况下,AssemblyResolve就出场了。

你可以像这样使用它。

static List<Assembly> AssemblyList = new List<Assembly>();

        static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
        {
            foreach (var item in AssemblyList)
            {
                if (item.ToString() == args.Name)
                {
                    return item;
                }
            }
            return null;
        }

 不管程序集在那个地方,但是,请不要放在loader目录下。

首先,要做的是重定向程序集,这一步我们已经做完了。(下面砸鸡蛋,下去,这么菜的。。。。,顶住压力楼主继续。。。)

好吧,然后是关于程序集锁定的问题,像这样:


 AssemblyList.Add(Assembly.Load( System.IO.File.ReadAllBytes(item.FullName)));


然后才是重头戏,如何卸载dll(都快睡着了。。。)

以下是伪代码,不一定能跑,大家看那么个意思。


DLL A:

public class ClassA

{

public ClassA()

{

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值