C#丢弃Appdomain 之 动态dll替换

    好久没写什么了,最近项目遇到一要求,为开发方便,需要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()

{

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值