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 @ 2023-05-13 15:55  LiveCoding  阅读(611)  评论(0)    收藏  举报