.NET CORE插件化开发--支持热更新
当使用LoadFromStream
方法加载程序集时,该程序集会被加载到一个特定的AssemblyLoadContext
实例中。通过调用Unload
方法,可以卸载整个AssemblyLoadContext
实例,从而释放该程序集及其相关资源。
而LoadFromAssemblyPath
方法则是在默认的应用程序域中加载程序集。在默认的应用程序域中,程序集加载后是无法卸载的,除非整个应用程序域被销毁。
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Service; using System.Reflection; using System.Runtime.Loader; namespace PluginApp.Controllers { [Route("api/[controller]/[action]")] [ApiController] public class HomeController : ControllerBase { [HttpGet] public object NoRefDll() { string fileName = Environment.CurrentDirectory + "\\DLL\\MyPlugin.dll"; AssemblyLoadContext abContext = new AssemblyLoadContext(Guid.NewGuid().ToString(), true); using var stream = new FileStream(fileName, FileMode.Open, FileAccess.Read); var assembly = abContext.LoadFromStream(stream); var type = assembly.ExportedTypes.FirstOrDefault(); var plugin = Activator.CreateInstance(type); var res = type.GetMethod("Execute")?.Invoke(plugin, null); abContext.Unload(); return res; } [HttpPost] public object RefDll() { string fileName = Environment.CurrentDirectory + "\\DLL\\DemoPlugin.dll"; AssemblyLoadContext abContext = new AssemblyLoadContext(Guid.NewGuid().ToString(), true); //不能使用LoadFromAssemblyPath,否则无法卸载成功 //var assembly = abContext.LoadFromAssemblyPath(fileName); using var stream = new FileStream(fileName, FileMode.Open, FileAccess.Read); var assembly = abContext.LoadFromStream(stream); var type = assembly.ExportedTypes.FirstOrDefault(); var plugin = (IPlugin?)Activator.CreateInstance(type); var res = plugin.Execute(); abContext.Unload(); return res; } } }
email:654088909@qq.com
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义