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

时间:2023-06-08 08:18:08 

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;           
        }
    }
}


注意:

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

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

标签:动态加载,动态卸载,DLL
0
投稿

猜你喜欢

  • Java JNDI案例详解

    2022-06-09 07:56:35
  • Android 实现切圆图作为头像使用实例

    2023-04-29 04:08:08
  • java使用Abobe Acrobat DC生成模板

    2022-04-14 21:03:12
  • Java建造者模式构建复杂对象的最佳实践

    2021-06-27 10:07:16
  • jpa多数据源时Hibernate配置自动生成表不生效的解决

    2023-04-24 06:19:55
  • Android自定义有限制区域的图例角度自识别涂鸦工具类完结篇

    2022-10-22 23:05:13
  • 操作xml,将xml数据显示到treeview的C#代码

    2023-01-02 19:56:48
  • springboot整合mybatisplus的方法详解

    2023-05-20 18:35:05
  • Android支付宝支付的示例代码

    2022-06-20 02:32:49
  • java参数传递之值传递和引用传递

    2021-09-26 10:28:46
  • Java泛型的简单实例

    2023-11-27 01:03:38
  • 深入了解Spring中的@Autowired和@Resource注解

    2021-09-19 06:57:20
  • 关于springcloud集成nacos遇到的问题

    2022-02-27 17:41:46
  • C#文件流读写和进度回调示例详解

    2022-08-12 14:52:31
  • Android 自定义组件成JAR包的实现方法

    2023-04-08 17:56:39
  • C#解析json字符串总是多出双引号的原因分析及解决办法

    2022-10-22 02:40:46
  • SpringBoot利用@Retryable注解实现接口重试

    2023-03-08 19:54:42
  • Ajax登录验证实现代码

    2022-02-22 10:47:51
  • Java CPU性能分析工具代码实例

    2023-09-28 04:52:54
  • Java读写txt文件时防止中文乱码问题出现的方法介绍

    2023-06-23 04:40:32
  • asp之家 软件编程 m.aspxhome.com