.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