使用 AssemblyLoadContext 加载和卸载程序集
准备俩个项目
第一个是控制台
第二个项目是类库
类库项目中只有一个示例class,将类库的代码生成dll
并且设置属性为复制到输出目录
using System.Runtime.Loader;
var domain = new AssemblyLoadContext("DomainServer", true);
var assembly = domain.LoadFromAssemblyPath(Path.Combine(AppContext.BaseDirectory, "DomainServer.dll"));
foreach (var context in AssemblyLoadContext.All)
{
Console.WriteLine("当前存在的程序集:"+context.Name);
}
Console.WriteLine("-------------------------");
domain.Unload();
foreach (var context in AssemblyLoadContext.All)
{
Console.WriteLine("当前存在的程序集:" + context.Name);
}
Console.ReadKey();
写入代码到Program类中 由于项目使用.net7创建 所以采用顶级语法 没有main方法
然后执行程序
测试
我们看到当加载程序的时候我们的项目中存在了俩个程序集
当前Unload卸载程序集的时候我们项目只存在一个程序集
使用 new AssemblyLoadContext("DomainServer", true); 创建一个AssemblyLoadContext对象
第二个参数 true启用卸载;否则,假的。默认值为false,因为启用卸载会带来性能损失。
这个卸载只会卸载AssemblyLoadContext中加载的所有程序集
我们还可以订阅卸载事件这样就知道那些程序集卸载成功了
using System.Runtime.Loader; var domain = new AssemblyLoadContext("DomainServer",true); var assembly = domain.LoadFromAssemblyPath(Path.Combine(AppContext.BaseDirectory, "DomainServer.dll")); foreach (var context in AssemblyLoadContext.All) { Console.WriteLine("当前存在的程序集:"+context.Name); } Console.WriteLine("-------------------------"); domain.Unloading += context => { Console.WriteLine("当前卸载的程序集:"+string.Join(',', context.Assemblies.Select(x => x.FullName))); }; domain.Unload(); foreach (var context in AssemblyLoadContext.All) { Console.WriteLine("当前存在的程序集:" + context.Name); } Console.ReadKey();
执行效果:
好了介绍到这里!
.Net 6以上版本都可以使用的方法
技术分享群:737776595
来自 token的分享
出处:https://www.cnblogs.com/hejiale010426/p/16881430.html
关注我】。(●'◡'●)
如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的【因为,我的写作热情也离不开您的肯定与支持,感谢您的阅读,我是【Jack_孟】!
本文来自博客园,作者:jack_Meng,转载请注明原文链接:https://www.cnblogs.com/mq0036/p/16887972.html
【免责声明】本文来自源于网络,如涉及版权或侵权问题,请及时联系我们,我们将第一时间删除或更改!