hello world

.NET CORE插件化开发--支持热更新

当使用LoadFromStream方法加载程序集时,该程序集会被加载到一个特定的AssemblyLoadContext实例中。通过调用Unload方法,可以卸载整个AssemblyLoadContext实例,从而释放该程序集及其相关资源。

LoadFromAssemblyPath方法则是在默认的应用程序域中加载程序集。在默认的应用程序域中,程序集加载后是无法卸载的,除非整个应用程序域被销毁。

源码地址:https://github.com/ilivecoding/PluginApp
复制代码
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;
        }

    }
}
复制代码

 

posted @   LiveCoding  阅读(537)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示