c#动态加载卸载DLL的方法

这篇文章介绍了c#动态加载卸载DLL的方法,有需要的朋友可以参考一下c#中通过反射可以方便的动态加载dll程序集,但是如果你需要对dll进行更新,却发现.net类库没有提供卸载dll程序集的方法。在

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

这篇文章介绍了c#动态加载卸载DLL的方法,有需要的朋友可以参考一下

c#中通过反射可以方便的动态加载dll程序集,但是如果你需要对dll进行更新,却发现.net类库没有提供卸载dll程序集的方法。在.net 中,加入了应用程序域的概念,应用程序域是可以卸载的。也就是说,如果需要对动态加载的dll程序集进行更新,可以通过以下方法解决:

新建一个应用程序域,在该应用程序域中动态加载DLL,然后可以卸载掉该应用程序域。该应用程序域被卸载的时候,相关资源也会被回收。

要想这样实现,就要让你程序的currentDomain和新建的newDomain之间进行通信,穿过应用程序域的边界。从网上找到了某大牛的解决方法,抄下来留给自己看吧: 

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Threading; 
using System.Reflection; 
namespace UnloadDll 
{ 
    class Program 
    { 
        static void Main(string[] args) 
        { 
            string callingDomainName = AppDomain.CurrentDomain.FriendlyName;//Thread.GetDomain().FriendlyName; 
            Console.WriteLine(callingDomainName); 
            AppDomain ad = AppDomain.CreateDomain("DLL Unload test"); 
            ProxyObject obj = (ProxyObject)ad.CreateInstanceFromAndUnwrap(@"UnloadDll.exe", "UnloadDll.ProxyObject"); 
            obj.LoadAssembly(); 
            obj.Invoke("TestDll.Class1", "Test", "It's a test"); 
            AppDomain.Unload(ad); 
            obj = null; 
            Console.ReadLine(); 
        } 
    } 
    class ProxyObject : MarshalByRefObject 
    { 
        Assembly assembly = null; 
        public void LoadAssembly() 
        { 
            assembly = Assembly.LoadFile(@"TestDLL.dll");            
        } 
        public bool Invoke(string fullClassName, string methodName, params Object[] args) 
        { 
            if(assembly == null) 
                return false; 
            Type tp = assembly.GetType(fullClassName); 
            if (tp == null) 
                return false; 
            MethodInfo method = tp.GetMethod(methodName); 
            if (method == null) 
                return false; 
            Object obj = Activator.CreateInstance(tp); 
            method.Invoke(obj, args); 
            return true;            
        } 
    } /* 何问起 hovertree.com */
} 

注意:

 

1. 要想让一个对象能够穿过AppDomain边界,必须要继承MarshalByRefObject类,否则无法被其他AppDomain使用。

2. 每个线程都有一个默认的AppDomain,可以通过Thread.GetDomain()来得到

推荐:

http://hovertree.com/h/bjaf/scjyuanma.htm

http://www.cnblogs.com/roucheng/p/netkuangjia.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120322.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • jquery checkbox 选中方法「建议收藏」

    jquery checkbox 选中方法「建议收藏」方法一:if($(“#checkbox-id”)get(0).checked){//dosomething}方法二:最佳if($(‘#checkbox-id’).is(‘:checked’)){//dosomething}方法三:if($(‘#checkbox-id’).attr(‘checked’)){//dos

    2022年7月15日
    18
  • 奔图打印机显示未连接_奔图打印机常见故障及解决方法

    奔图打印机显示未连接_奔图打印机常见故障及解决方法奔图打印机常见故障及解决方法如何应对打印机卡纸?卡纸是激光打印机用户最常遇到的问题,造成卡纸的原因有很多,那么如何能够避免卡纸或降低卡纸的机率呢,我们需要注意以下几个方面:Ÿ尽量不要二次用纸,因为打印过一次的纸经过加热会造成纸张柔韧性下降,更加易断易碎容易造成卡纸。Ÿ使用平整的纸张,褶皱或折角的纸更容易卡在机器内部造成卡纸。Ÿ使用质量较好的纸张,一些质量不好的复印纸容易产生大量的纸屑长时间使…

    2022年6月2日
    83
  • fork join原理_典型相关分析

    fork join原理_典型相关分析privateForkJoinPool(intparallelism,ForkJoinWorkerThreadFactoryfactory,UncaughtExceptionHandlerhandler,intmode,StringworkerNamePrefix)fo…

    2022年9月20日
    3
  • springboot 配置mybatis通用mapper

    springboot 配置mybatis通用mapper声明:此处为springboot配置mybatis的通用mapper方一共步其他多余操作不要有1添加mapper依赖一定要有以下依赖的jar包注意jar包版本,太高会导致功能不可用<!–SpringBootMybatis依赖–><dependency><groupId>org…

    2022年6月24日
    85
  • spring循环依赖为什么不是二级缓存_有效循环血量不依赖

    spring循环依赖为什么不是二级缓存_有效循环血量不依赖前置知识:所谓的三级缓存只是三个可以当作是全局变量的Map,Spring的源码中大量使用了这种先将数据放入容器中等使用结束再销毁的代码风格Spring的初始化过程大致有四步我们说的循环依赖就是第四步在给Bean属性注入的时候发生的一个问题循环依赖就是:假设有两个类A和B,A中需要注入B,B中需要注入A由于A注入B时B没有创建,B创建时A也无法创建导致的死循环问题我们都知道AOP是Spring的一个重要核心思想,其实现就是根据动态代理来实现的,也就是说我们的Bean其实很大概率都是要生成代理类,让

    2025年7月13日
    5
  • ui ue设计是什么_ui设计师

    ui ue设计是什么_ui设计师设计在我们的生活中扮演着重要的角色,但是面对越来越多的专业术语和相近的岗位职责,人们总是困惑:明明是差不多的岗位,为什么要整那么多的词。UI、UE、UID、UED相信很多人都弄不清楚这些名字是什么意思,到底有什么区别。其实,在它们神似的外表下,潜藏着巨大的差异。本文,就来详细说说UI设计和UE设计这是两种概念,以及如何将它们区分开来。一、UI、UE的定义1、UI:UserInterface…

    2022年4月19日
    79

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号