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