千家信息网

.NET Core 3.0可回收程序集加载上下文怎么实现

发表于:2025-12-01 作者:千家信息网编辑
千家信息网最后更新 2025年12月01日,这篇文章主要讲解了".NET Core 3.0可回收程序集加载上下文怎么实现",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习".NET Core 3.0可
千家信息网最后更新 2025年12月01日.NET Core 3.0可回收程序集加载上下文怎么实现

这篇文章主要讲解了".NET Core 3.0可回收程序集加载上下文怎么实现",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习".NET Core 3.0可回收程序集加载上下文怎么实现"吧!

一、前世今生

.NET诞生以来,程序集的动态加载和卸载都是一个Hack的技术,之前的NetFx都是使用AppDomain的方式去加载程序集,然而AppDomain并没有提供直接卸载一个程序集的API,而是要卸载整个AppDomain才能卸载包含在其中的所有程序集。然而卸载整个CurrentAppDomain会使程序不能工作。可能有人另辟西经,创建别一个AppDomain来加载/卸载程序集,但是由于程序集之间是不能跨域访问的,也导致只能通过Remote Proxy的方式去访问,这样在类型创建和使用上带来了一定的难度也是类型的继承变得相当复杂。

.NET Core中一直没有AppDomain的支持。但是在.NET Core 3.0中,我最期待的一个特性就是对可收集程序集的支持(Collectible AssemblyLoadContext)。众所周知.NET Core中一直使用AssemblyLoadContext的API,来进行程序集的动态加载,但是并没有提供Unload的方法,此次升级更新了这方面的能力。

二、AssemblyLoadContext

其实这次AssemblyLoadContext的设计,我认为更像是Java中ClassLoader的翻版,可以说非常类似。在使用过程中自定义AssemblyLoadContext可以内部管理其中的程序集,并对整体Context进行Unload。使用AssemblyLoadContext也可以避免程序集名称和版本的冲突。

三、Getting Started

.NET Core 3.0还没有正式版,所有要使用预览版的SDK完成以下实例。我使用的是.NET Core SDK 3.0.100-preview-009812

dotnet new globaljson --sdk-version 3.0.100-preview-009812

AssemblyLoadContext是一个抽象类的,我们需要子类化。下面显示的是我们创建自定义AssemblyLoadContext的方法,实现一个可回收的Context需要在构造器中指定isCollectible: true :

public class CollectibleAssemblyLoadContext : AssemblyLoadContext{    public CollectibleAssemblyLoadContext() : base(isCollectible: true)       { }     protected override Assembly Load(AssemblyName assemblyName)       {             return null;    }}

使用netstandard2.0创建一个library

using System; namespace SampleLibrary{    public class SayHello    {            public void Hello(int iteration)             {            Console.WriteLine($"Hello {iteration}!");        }    }}

测试Load/Unload


var context = new CollectibleAssemblyLoadContext();var assemblyPath = Path.Combine(Directory.GetCurrentDirectory(),"SampleLibrary.dll");using (var fs = new FileStream(assemblyPath, FileMode.Open, FileAccess.Read)){    var assembly = context.LoadFromStream(fs);
var type = assembly.GetType("SampleLibrary.SayHello"); var greetMethod = type.GetMethod("Hello");
var instance = Activator.CreateInstance(type); greetMethod.Invoke(instance, new object[] { i });}
context.Unload();
GC.Collect();GC.WaitForPendingFinalizers();

当执行GC收回后,加载的程序集会被完全的回收。

感谢各位的阅读,以上就是".NET Core 3.0可回收程序集加载上下文怎么实现"的内容了,经过本文的学习后,相信大家对.NET Core 3.0可回收程序集加载上下文怎么实现这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

程序 上下 上下文 学习 内容 动态 就是 方式 方法 类型 支持 复杂 众所周知 中指 之间 内部管理 名称 子类 实例 思路 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 wincc加载不了数据库 数据库分析和设计的实验结论 两个数据库录入怎么对比错误 2k20pro服务器不可用 万得数据库如何导出股票数据 网络安全中的拒绝访问 自搭服务器节点 武汉电脑软件开发流程 数据库技术导论期末总结 日租卡服务器免流 网络安全意识心得体会论文 社交软件开发企业的展望 如何保障网络安全稳定 数据库 功能模块设计与概念设计 数据库连接错误1045 中国网络安全法处罚规定 荟商信息科技谈互联网广告 苍溪软件开发商 vb中修改数据库信息 网络安全知识社区宣传图片 硬科技互联网 华为账号登录连接不了服务器 数据库查询结果再进行多次筛选 广东省信息网络安全协会 校园网络安全防范的主要目的 泰安联想服务器总代理客服电话 网络安全 图标素材 社交软件开发企业的展望 怎样通过窗体删除表中数据库 oracle数据库连接名
0