.Net6新版本的AssemblyLoadContext 加载程序集和卸载程序集

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了.Net6新版本的AssemblyLoadContext 加载程序集和卸载程序集相关的知识,希望对你有一定的参考价值。

.Net6新版本的AssemblyLoadContext 加载程序集和卸载程序集

img

准备俩个项目

第一个是控制台

第二个项目是类库

类库项目中只有一个示例class

将类库的代码生成dll

img

并且设置属性为复制到输出目录

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();

[](javascript:void(0);)

写入代码到Program类中 由于项目使用.Net7创建 所以采用顶级语法 没有main方法

然后执行程序

img

我们看到当加载程序的时候我们的项目中存在了俩个程序集

当前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的分享

以上是关于.Net6新版本的AssemblyLoadContext 加载程序集和卸载程序集的主要内容,如果未能解决你的问题,请参考以下文章

任何新版本的 tf.placeholder?

通过 REST 添加新版本的密钥

网址未定义。重构为新版本的 angularfire, angular

新版本的默认上传文件是600权限

将 grafana 迁移到较新版本的最佳方法是啥? [关闭]

新版本的vue在写路由的时候前面不能写 /