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

net6,版本,assemblyloadcontext,加载,程序,卸载 · 浏览次数 : 369

小编点评

.Net 6新版本的AssemblyLoadContext 加载程序集和卸载程序集准备俩个项目,其中一个是控制台另一个是类库项目中只有一个示例class将类库的代码生成dll并且设置属性为复制到输出目录。 **控制台项目** ```csharp 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("当前存在的程序集:{0}", context.Name); } domain.Unload(); foreach (var context in AssemblyLoadContext.All) { Console.WriteLine("当前存在的程序集:{0}", context.Name); } Console.ReadKey(); ``` **类库项目** ```csharp 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("当前存在的程序集:{0}", context.Name); } domain.Unloading += context => { Console.WriteLine("当前卸载的程序集:{0}", string.Join(",", context.Assemblies.Select(x => x.FullName))); }; domain.Unload(); foreach (var context in AssemblyLoadContext.All) { Console.WriteLine("当前存在的程序集:{0}", context.Name); } Console.ReadKey(); ``` **效果** 运行控制台项目,会看到以下输出: ``` 当前存在的程序集:DomainServer ------------------------ 当前存在的程序集:DomainServer ``` 运行类库项目,会看到以下输出: ``` 当前存在的程序集:DomainServer ------------------------ 当前存在程序集:DomainServer 当前卸载的程序集:DomainServer ```

正文

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

执行效果:

img

注:卸载的前提是引用的对象都被释放!

.Net 6以上版本都可以使用的方法

好了介绍到这里!

技术分享群:737776595

来自 token的分享

与.Net6新版本的AssemblyLoadContext 加载程序集和卸载程序集相似的内容:

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

.Net6新版本的AssemblyLoadContext 加载程序集和卸载程序集 准备俩个项目 第一个是控制台 第二个项目是类库 类库项目中只有一个示例class 将类库的代码生成dll 并且设置属性为复制到输出目录 using System.Runtime.Loader; var domain =

如何在Net6.0里配置多版本支持并支持注释说明的Swagger

一、前言 现在已经进入了微服务的开发时代了,在这个时代,如果有人问你什么是微服务,你说不知道,就有点太丢人了,别人会有异样的眼光看你,俗话说:唾液淹死人。没办法,我们只能去学习新的东西。一提到微服务,有一个绕不过的话题就是作为微服务的载体,WebAPI是离不开的。但是我们今天不讲WebAPI是什么,

Net6之Jwt认证+Bearer认证 2.0

以前接触过,写过博客,第二次再写有了新的体会。第一次博客:https://www.cnblogs.com/zhang-3/p/16184067.html 过程: 生成token令牌(钥匙) 添加bearer认证 (验证钥匙是否正确) 给接口或控制器添加验证 (锁) 给接口添加显示的小锁 1.引入包:

.Net 中间件 - 新开源代码生成器 -ReZero

ReZero AP ReZero是一款.NET中间件 : 全网唯一界面操作就能生成API , 可以集成到任何.NET6+ API项目,无破坏性,也可让非.NET用户使用exe文件 ReZero生成器功能简介 1、表文档导出:支持目录导航 2、在创建表、在线建库 3、一键导入现有表 4、模版在线调试

ASP.NET Core设置URLs的几种方法,完美解决.NET 6项目局域网IP地址远程无法访问的问题

近期在dotnet项目中遇到这样的问题:.net6 运行以后无法通过局域网IP地址远程访问。后查阅官方文档。整理出解决问题的五种方式方法,通过新建一个新的WebApi项目演示如下: 说明 操作系统:Ubuntu 22.04.2 运行时:.NET 6 开发工具:Visual Studio 2202 新

NET6使用AutoFac依赖注入(仓储模式)

第一次使用autofac,然后net6最新长期支持的,就想着在net6的基础上使用autofac,我对依赖注入理解很差,一知半解的搞了好久。好在有了一点点的头绪,记录下省的以后忘记(突然发现自己以前用过的东西忘了好多……) 1.首先你要有个仓储模式的项目、这个自己搭建吧 2.在Program.cs文

.NET6 + EF Core + MySQL 创建实体和数据库、EFCore 数据迁移

前言 接上期文章《.NET6项目连接数据库方式方法》,有人问了我几个问题,现在就这几个问题,拓展延申一下创建实体类、数据库。把ORM框架和数据迁移都写进去。 安装ORM框架,这里我们采用EFCore 安装EFCore 我的项目是在Linux上创建的,使用的是vscode开发工具远程开发。为了方便大家

.NET6项目连接数据库方式方法

前言 接上一篇Linux系统下创建dotnet项目,这一篇我们聊聊.NET6环境下dotnet项目连接数据库的方式方法,包括数据库字符串该如何配置。看了很多博主写的文章,连接数据库字符串配置的方式和位置五花八门,这篇文章给大家介绍一下连接数据库字符串的配置方式方法,顺便介绍下一个新创建的dotnet

如何在 Net6.0 中对 WebAPI 进行 JWT 认证和授权

一、简介 我们做微服务开发,或者说做分布式开发,有一项技术我们是避不开的,那就是WebAPI,在 Net6.0中,有两类 WebAPI,一类是极简 WebAPI,它砍掉了很多冗余的东西,更纯粹的是做 API的,也更适合做微服务的开发。另外一类就是我们通常使用的正常 API,这个没得说,也是我们使用最

DoNet Core的启动过程-WebApplicationBuilder

1.前言 在NET6开始做ASP.NETCore的开发,我们首先要看的是启动过程,而WebApplication和WebApplicationBuilder 类是启动过程好不开的类,WebApplicationBuilder 来引导启动,这和前面Core的版本引导启动分为Program和Startu