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

UnrealCLR动态加载与热重载:提升UE5 C#开发效率的核心技术 动态链接库(DLL)是软件模块化开发的基础组件,它允许程序在运行时加载和卸载功能模块,从而实现灵活的架构设计和资源管理。其核心原理在于操作系统提供的动态链接机制,使得多个应用程序可以共享代码库,减少内存占用并支持功能更新。在游戏开发领域,这项技术的价值尤为突出,能够实现快速迭代和实时调试,显著提升开发效率。通过热重载技术,开发者可以在游戏运行过程中直接修改代码并立即看到效果,无需重启整个应用,极大地优化了调试和内容调整的工作流。在Unreal Engine 5与C#结合的开发场景中,利用UnrealCLR插 阅读详情

从 .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库。

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

NetCore基于Roslyn的动态编译实现 AvalonEdit文本器+NRefactory+Roslyn动态编译 1. AvalonEdit实现编写,高亮,复制,黏贴,撤回等基础功能 2. NRefactory实现代码提示相关 3. Roslyn实现动态编译(CSharpCodeProvider只支持Framework,Roslyn可以同时支持Framwork和netcore) 阅读详情

相关推荐

DotNetCorePlugins:.NET Core库,用于动态加载代码

.NET Core插件 该项目提供了API,用于动态加载.NET Core程序集,将其作为主应用程序的扩展来执行,以及从主应用程序中查找和隔离插件的依赖项。 该库支持.NET Core 2,但在.NET Core 3及更高版本中效果最佳。 它允许对程序集隔离和类型共享进行细粒度的控制。 阅读。 介绍此项目的博客文章,2018年7月25日: 。 自2018年以来,.NET Core 3已发布,并添加了stdlib API以改善程序集加载。 如果您有兴趣了解该API,请参阅docs.microsoft.com上的“ ”。 本教程的结果将是DotNetCorePlugins的简单版本,但缺少一些功能,例如用于跨加载上下文边界统一类型的API,热重载和.NET Core 2支持。 入门 安装 dotnet add package McMaster.NETCore.Plugins 要使用的

DotNetCorePlugins- 动态加载和卸载 .NET 程序插件

DotNetCorePlugins 是一个 .NET 的开源插件项目,它提供了能够动态加载程序集的 API,然后把它们作为 .NET 主程序的扩展程序执行。

寒冰屋的专栏 672

手动安装SeuratData包中pbmc3k数据集的详细步骤与避坑指南

本文提供了手动安装SeuratData包中pbmc3k数据集的详细步骤与避坑指南。针对国内用户网络不稳定导致自动下载失败的问题,文章核心介绍了如何从错误信息中获取下载链接,使用浏览器或下载工具完成手动下载,并通过指定本地文件路径和参数在R中成功安装。该方法同样适用于SeuratData包中的其他数据集,是单细胞分析入门的必备生存技能。

weixin_29054399的博客 183

.net core 程序集的加载与卸载

.net core 2.0支持程序集动态加载,.net core 3.0支持程序集动态卸载 程序集动态加载卸载使用AssemblyLoadContext 每个程序都具有一个默认的AssemblyLoadContext,AssemblyLoadContext包含以加载的程序集集合,当AssemblyLoadContext被卸载时,对应的程序集也会在下一次GC回收时被回收 要创建新的AssemblyLoadContext需要实现AssemblyLoadContext public class ActuatorA

dabusidede的博客 1387

AD9361 LVDS数据接口时序解析与FPGA实现

本文详细解析了AD9361 LVDS数据接口的时序特性与FPGA实现方法,重点探讨了DATA_CLK、Rx_FRAME等关键信号的时序关系及数据拼接技巧。通过Verilog代码示例和调试经验分享,帮助开发者解决跨时钟域处理、IQ数据重组等常见问题,提升射频收发系统的稳定性与性能。

weixin_29186249的博客 128

Windows10下RTABMAP+T265实现三维建图

win10+rtabmap+t265扫描地形

Suxiang1997的博客 3486

C#编程,浅谈.NET中程序集的动态加载

C#程序集的动态引用

君一席 2163

告别配置迷茫:手把手教你用Vivado 2023.1配置Xilinx FPGA的DDR4 MIG IP核(含AXI接口详解)

本文详细介绍了如何在Vivado 2023.1中配置Xilinx FPGA的DDR4 MIG IP核,包括AXI接口的深度解析与优化。通过实战案例和调试技巧,帮助工程师快速掌握DDR4内存与FPGA的协同工作,提升系统性能。特别适合需要高性能计算和实时信号处理的开发者。

weixin_29231725的博客 437

.net core 3.0中动态卸载程序集

动态加载程序集在一些插件式的应用中非常常见,.net core 2.0中可以通过AssemblyLoadContext中提供程序集的动态加载功能,但取不支持卸载。现在,在.net core 3.0中提供了程序集卸载的支持(Collectible AssemblyLoadContext),更加完善了这方面的功能。 由于AssemblyLoadContext是一个抽象类,要实现这个动态程序...

weixin_30432007的博客 436

升降机SEW MOVIDRIVE变频器设置

选择PO1 第2,3,9,13 位,点击“SendPA”Start reference,编码器反馈值为0(PI2/3 Actual position=0)提示:传送参考位置前请断开变频器安全24V电源,否则会弹出禁止修改提示框;提示:做这一步时,如果出现电机不能转动,或产生报警不能通过编码器匹配。下载配置的参数,提示:下载参数需要断开变频器的安全24V电源。编码器匹配通过后点击下一步,进入下图画面传送参考位置。1电机不能转动:a可能是由于变频器的安全24V未给。点击2.SEW总线扩展定位,定位块设置。

xdpcxq的专栏 5397

手把手教你学simulink(31.31)--双向DCDC电源场景示例:设计并实现一个基于变频控制的双向降压变换

设计并实现一个基于 Simulink 的双向降压变换器,能够在充电模式(从高压侧向低压侧传输能量)和放电模式(从低压侧向高压侧传输能量)之间切换,确保输出电压稳定,并根据负载变化自动调整工作模式。

MHD0815的博客 343

.NET Core 3.0 可回收程序集加载上下文

.NET诞生以来,程序集的动态加载和卸载都是一个Hack的技术,之前的NetFx都是使用AppDomain的方式去加载程序集,然而AppDomain并没有提供直接卸载一个...

dotNET跨平台 236

【某音电商】protobuf聊天协议逆向

某音电商私信、聊天消息protobuf协议逆向分析与解析

吴秋霖的博客 2314

C#面试必问:应用程序域AppDomain原理与.NET Core替代方案

在.NET运行时中,程序集的加载与隔离是构建复杂应用的关键问题。CLR(公共语言运行时)通过应用程序域(AppDomain)在进程内划分托管隔离边界,实现类型、配置与安全策略的独立管理,同时支持按域卸载程序集。相比进程级隔离,AppDomain以更轻量的方式解决插件隔离、动态加载和资源回收问题,跨域调用则需借助MarshalByRefObject或序列化复制。然而,随着.NET Core的演进,多AppDomain模型因维护成本与性能问题被移除,取而代之的是AssemblyLoadContext,它提供了更

weixin_29278805的博客 253

基于ESP32和OV5640的目标检测系统

本文详细介绍了基于ESP32-S3和OV5640摄像头构建目标检测系统的完整方案。系统采用YOLOv8-Nano轻量级模型,通过INT8量化实现边缘部署,在UXGA分辨率下达到25fps帧率。文章从硬件选型、图像采集优化、模型量化部署、实时推理流水线构建等维度展开,重点解决了内存管理、电源稳定性和异常处理等嵌入式系统关键问题。该方案在资源受限条件下实现了150ms以内的端到端延迟,为物联网视觉应用提供了低成本、低功耗的解决方案,适用于智能家居、工业检测等多个场景。

reset2021的博客 329

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

DotNetCorePlugins 项目常见问题解决方案

DotNetCorePlugins 是一个用于 .NET Core 平台的开源库,旨在动态加载代码。它允许开发者将 .NET Core 程序集作为插件加载到主应用程序中,并执行这些插件。该项目支持 .NET Core 2.x 及以上版本,但在 .NET Core 3.x 及以上版本中表现最佳。DotNetCorePlugins 提供了细粒度的控制,允许在插件和主应用程序之间共享类型,并支持插件的卸...

gitblog_01122的博客 615

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

从零开始实现ASP.NET Core MVC的插件式开发(五) - 插件的删除和升级

标题:从零开始实现ASP.NET Core MVC的插件式开发(五) - 使用AssemblyLoadContext实现插件的升级和删除 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/p/11395828.html 源代码:https://github.com/lamondlu/Mystique 前景回顾: 从零开始实现ASP.NE...

weixin_30954265的博客 737

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C#怎么实现动态加载DLL C#如何在运行时动态加载和卸载程序集调用其中的方法【进阶】

AssemblyLoadContext(ALC)是.NET Core/.NET 5+中唯一可卸载程序集的机制,需创建isCollectible=true的非默认ALC,通过其LoadFromAssemblyPath加载,并用委托或ExecuteInLoadContext跨上下文调用,卸载前须清除所有引用并确保无后台线程或事件残留。

qq_65436698的博客 234

DotNetCorePlugins 使用教程

DotNetCorePlugins 是一个用于 .NET Core 的开源库,它允许开发者动态加载和卸载程序集,从而实现应用程序的扩展和插件系统。该项目主要利用了 .NET Core 中的 AssemblyLoadContext 技术,提供了细粒度的程序集隔离和类型共享控制。 ## 项目快速启动 ### 安装 首先,通过 NuGet 安装 DotNetCorePlugins 包: ```b

gitblog_00373的博客 530

C# 动态加载程序集的三大场景解析:从基础应用到高级技巧

本文深入解析C#动态加载程序集的三大核心应用场景:插件系统开发、多版本并行调试与热更新实现。详细探讨了Assembly.LoadFrom、Assembly.LoadFile等方法在不同场景下的适用性与陷阱,并介绍了通过独立AppDomain实现插件隔离、利用AssemblyResolve事件处理依赖以及使用MetadataLoadContext进行安全分析等高级技巧,为构建高扩展性与可维护性的C#应用提供实践指导。

weixin_29196891的博客 269

AppDomain实战指南:程序集卸载与热更新插件架构解析

应用程序域(AppDomain)是.NET运行时提供的一种进程内逻辑隔离机制,它允许在同一进程中划分多个独立沙盒,用于解决程序集加载后无法卸载、配置隔离、异常隔离等核心问题。理解AppDomain的工作原理,掌握跨域通信、MarshalByRefObject代理以及类型身份边界,是构建可靠插件系统和热更新机制的基础。进入.NET Core时代,AppDomain的角色被大幅弱化,AssemblyLoadContext(ALC)成为实现程序集级隔离与动态卸载的主流方案,但其中同样隐藏着文件锁、依赖解析、异步卸

weixin_33600816的博客 260

.NET Core 动态插件系统:实现模块化扩展与热更新

/ 插件元数据// 插件生命周期// 功能扩展点// 数据迁移插件。

开发小能手-Haha king的博客 103

AppDomain

在传统的 Windows 编程中,一个应用程序对应一个进程,进程之间是天然隔离的,一个进程崩了不会影响另一个。比如,你可以创建一个“沙箱域”来运行从网络下载的不受信任的插件,限制它不能读写硬盘、不能访问注册表,从而保护主程序的安全。:虽然比跨进程通信快,但通过代理跨域调用对象方法,仍然比直接调用有性能损耗,因为涉及参数和返回值的序列化/反序列化(按引用传递的对象除外)。你可以创建一个新的域,在里面加载并执行一些程序集(比如一个插件),当不再需要时,可以。的概念仍然存在,且是运行时的基石。

like_sunshine978的博客 580

ET框架服务端热更:不重启进程实现业务逻辑动态更新

在游戏服务器开发中,业务逻辑的更新往往需要重启进程,这不仅影响玩家体验,还可能导致数据不一致等问题。ET框架作为一款成熟的Unity3D客户端和C#服务器双端框架,提供了完善的服务端热更新机制,能够在不重启进程的情况下实现业务逻辑的动态更新。本文将详细介绍ET框架服务端热更新的实现原理、操作步骤以及注意事项。 ### 一、ET框架服务端热更新概述 ET框架的服务端热更新机制是其核心特性之一,与...

gitblog_00791的博客 1145
上一篇: Windows 10 X64 内核对象句柄表解析
下一篇: 在Windows平台编译OpenJdk8
IT回忆录
博客等级 码龄16年 42粉丝 100原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值