.Net Core 动态加载和卸载程序集

news2024/11/28 0:16:26

从 .Net Core 3.0开始支持程序集的加载和卸载,在 .Net FrameWork中使用独立的应用程序域来实现同样的功能,.Net Core 不支持创建多个应用程序域,所以无法使用多个应用程序域来实现程序集动态加载和卸载。

AssemblyLoadContext

    程序集加载上下文,它代表一个程序集加载域,在这个域中可以加载、解析、卸载程序集

创建一个 .Net 库项目

    public class Class1
    {
        public void Fn1()
        {
            Console.WriteLine("Fn1");
        }

        public void Fn2()
        {
            Console.WriteLine("Fn2");
        }
    }

创建一个控制台项目

实现一个自定义程序集加载上下文类,  isCollectible 表示是否支持程序集卸载,默认是 false,所以需要从 AssemblyLoadContext 继承并实现一个AssemblyLoadContext。

    internal class MyAssemblyContext:AssemblyLoadContext
    {
        public MyAssemblyContext() : base(isCollectible: true)
        { }
    }

测试加载和卸载方法

        //告诉编译器不要内联该方法,防止栈上存在引用导致无法UnLoad。
        [MethodImpl(MethodImplOptions.NoInlining)]
        static void CallLib(string assemblyPath, out WeakReference alcWeakRef)
        {
            MyAssemblyContext mlc = new MyAssemblyContext();

            //加载 assemblyPath 程序集到 MyAssemblyContext 上下文中
            Assembly clib = mlc.LoadFromAssemblyPath(assemblyPath);

            //引用 程序集加载上下文,用于确认当UnLoad时,上下文被正确清理掉了。
            alcWeakRef = new WeakReference(mlc, trackResurrection: true);

            Console.WriteLine("Load ClassLibrary1.dll success");

            Type t= clib.GetType("ClassLibrary1.Class1");
            object obj= Activator.CreateInstance(t);
            t.GetMethod("Fn1").Invoke(obj, new object[] { });

            Console.ReadKey();

            //清理程序集加载上下文并开始卸载该上下文中加载的程序集
            mlc.Unload();

            Console.WriteLine("UnLoad ClassLibrary1.dll success");
        }

测试程序集动态加载和卸载

            WeakReference testAlcWeakRef;
            CallLib("E:\\projs\\analyze_dump\\example_net\\net_demo\\ClassLibrary1\\bin\\Debug\\net7.0\\ClassLibrary1.dll",out testAlcWeakRef);

            //显示调用GC清理程序集加载上下文。
            for (int i = 0; testAlcWeakRef.IsAlive && (i < 10); i++)
            {
                GC.Collect();
                GC.WaitForPendingFinalizers();
            }

            Console.ReadKey();

成功加载程序集并实例化程序集中 Class1类并调用Fn1方法 

 在未卸载程序集前无法删除已加载的dll

 卸载程序集后可以正常删除

 

动态加载和卸载程序集用途

        动态更新程序,功能封装到独立的dll库。

        应用插件化支持,动态扩展功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/882350.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Antd的日期选择器中文化配置

当你使用antd的日期选择器后&#xff0c;你会发现日期什么都是英文的&#xff1a;即便你已经在项目中配置了中文化&#xff1a; 我确实已经配置了中文化&#xff1a; 但是为啥没生效&#xff1f;官网回答&#xff1a;FAQ - Ant Design dayjs中文网&#xff1a; 安装 | Day…

宝塔部署阿里云盘webdav

安装Docker 我的系统是CentOS8&#xff0c;如果直接安装会出错&#xff0c;可以看这篇文章&#xff1a;Failed to download metadata for repo ‘appstream‘ docker 国内镜像&#xff1a; http://hub-mirror.c.163.com/下载镜像 宝塔安装docker管理器&#xff0c;然后搜索…

深入了解IP地址查询的几种方式

随着互联网的发展&#xff0c;IP地址已经成为网络世界中不可或缺的部分。而准确地了解IP地址的来源和所属地区&#xff0c;对于网络安全和数据分析等方面具有重要意义。本文将介绍几种常见的IP地址查询方式&#xff0c;帮助读者深入了解IP地址的查询方法。 WHOIS查询 WHOIS查询…

VMware 安装 Centos7

VMware 安装 Centos7 1、首先&#xff0c;下载我们需要安装的 Centos7 镜像 链接&#xff1a;https://pan.baidu.com/s/1-O5nc4OwQye_yvzTCHeyvg 提取码&#xff1a;88882、打开VMware&#xff0c;点击新建虚拟机 3、选择典型&#xff0c;点击下一步 4、选择Centos7 iso文件镜…

实验二十九、正弦波变锯齿波电路

一、题目 将峰值为 1 V 1\,\textrm V 1V、频率为 100 Hz 100\,\textrm{Hz} 100Hz 的正弦波输入电压&#xff0c;变换为峰值为 5 V 5\,\textrm V 5V、频率为 200 Hz 200\,\textrm {Hz} 200Hz 的锯齿波电压。利用 Multisim 对所设计的电路进行仿真、修改&#xff0c;直至满足…

什么是主数据管理?企业主数据管理方法论

什么是主数据管理&#xff1f; 主数据又被称为黄金数据&#xff0c;其价值高也非常重要。对企业来说&#xff0c;主数据的重要性如何强调都不为过&#xff0c;主数据治理是企业数据治理中最为重要的一环。主数据管理的内容包括 主数据管理标准、主数据应用标准 和 主数据集成服…

虚拟化和容器化

目录 一. 虚拟化和容器化的概念 什么是虚拟化、容器化 案例 为什么要虚拟化、容器化&#xff1f; 二. 虚拟化实现方式 应用程序执行环境分层 虚拟化常见类别 虚拟机 容器 JVM 之类的虚拟机 三. 常见虚拟化实现 主机虚拟化(虚拟机)实现 容器虚拟化实现 容器虚拟化实现原理 容器…

JDK19 - 虚拟线程如何进行业务代码的改造

JDK19 - 虚拟线程如何进行业务代码的改造 一. 线程池的改造二. for 循环同步代码块改造2.1 自动关闭资源会等待所有异步任务执行完毕吗&#xff1f; 一. 线程池的改造 假设我们的代码中&#xff0c;原本是这样使用线程池的&#xff1a; public static ExecutorService getThr…

套接字类型,地址族,数据序列

Socket: 1.套接字中使用的协议族 2.套接字数据传输类型信息 3.计算机间通信中所使用的协议信息 PF_INET协议族中, 符合SOCK_STREAM的只有一个: tcp 所以第三个参数为0 UDP同理 TCP套接字: 可靠的,按序传递的,基于字节的面向连接的数据传输方式的套接字 :tcp套接字数据不存在边…

前后端分离------后端创建笔记(10)用户修改

本文章转载于【SpringBootVue】全网最简单但实用的前后端分离项目实战笔记 - 前端_大菜007的博客-CSDN博客 仅用于学习和讨论&#xff0c;如有侵权请联系 源码&#xff1a;https://gitee.com/green_vegetables/x-admin-project.git 素材&#xff1a;https://pan.baidu.com/s/…

(二)结构型模式:4、组合模式(Composite Pattern)(C++实例)

目录 1、组合模式&#xff08;Composite Pattern&#xff09;含义 2、组合模式应用场景 3、组合模式的优缺点 4、组合模式的UML图学习 5、C实现组合模式的简单示例&#xff08;公司的OA系统&#xff09; 1、组合模式&#xff08;Composite Pattern&#xff09;含义 组合模…

短剧cps分销系统源码搭建 短剧cps系统开发 短剧项目怎么做

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 一、短剧是什么&#xff1f;二、短剧项目怎么做&#xff1f;三、总结 前言 短剧分销系统&#xff1a; 对接他人短剧小程序片源&#xff0c;仅推广分销。用户看…

Docker基础概述

目录 ​编辑 一、Docker简介 二、 Docker与虚拟机的区别 1.1namespace的六项隔离 二、Docker核心概念 2.1镜像 2.2容器 2.3仓库 三、安装Docker 3.1查看 docker 版本信息 四、Docker 镜像操作 4.1搜索镜像 4.2获取镜像 4.3镜像加速下载 4.4查看镜像信息 4.5根据…

FL Studio 2023年正式更新到发布21.1新版!功能介绍

很高兴地宣布在去年12月发布重大版本更新后&#xff0c;FL Studio在2023年8月正式更新到21.1版。本次更新虽然只是维护性质&#xff0c;但我们还是为大家带来了一些全新的功能&#xff0c;包括通过钢琴卷中的音阶捕捉和自定义音符工具&#xff0c;引入更快、更有创意的音符编辑…

救生艇(力扣)贪心 JAVA

给定数组 people 。people[i]表示第 i 个人的体重 &#xff0c;船的数量不限&#xff0c;每艘船可以承载的最大重量为 limit。 每艘船最多可同时载两人&#xff0c;但条件是这些人的重量之和最多为 limit。 返回 承载所有人所需的最小船数 。 示例 1&#xff1a; 输入&#xff…

ssm实验室耗材管理系统源码和论文

ssm实验室耗材管理系统源码和论文023 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让…

交叉编译基本概念

1 什么是交叉编译 1.1 本地编译 在解释什么是交叉编译之前&#xff0c;要先明白什么是本地编译。 本地编译可以理解为&#xff0c;在当前编译平台下&#xff0c;编译出来的程序只能放到当前的平台下运行&#xff0c;平时我们常见的软件开发都是属于本地编译。 比如我们在X8…

C++11并发与多线程笔记(2)

C11并发与多线程笔记&#xff08;2&#xff09; 线程启动、结束&#xff0c;创建线程多法、join&#xff0c;detach 1. 范例演示线程运行的开始1.1 创建一个线程&#xff1a;1.2 join1.3 datch1.4 joinable 2. 其他创建线程的方法2.1 用类 重载了函数调用运算符2.2 lambda表达式…

Visual Studio 2022连接远程系统进行C/C++开发

Visual Studio被称为是宇宙最强IDE&#xff0c;以前开发Linux C/C服务器程序&#xff0c;基本上都是在Windows上使用VS编写跨平台的C/C代码&#xff0c;然后先在VS中编译、链接、调试&#xff0c;然后在Linux下编译、链接&#xff0c;再针对Linux下的特定代码进行调试。后面Vis…

【日常积累】Linux之screen命令使用

使用场景 大家可能遇到这样的情况&#xff0c;当我们使用终端连接工具如xshell连接到一台服务器时&#xff0c;当执行一个花费时间比较长的命令时&#xff0c;如cp&#xff0c;scp或者其他时&#xff0c;当xshell由于某种原因突然断掉后在连上服务器时&#xff0c;之前执行的命…