Asp.net Core 反射加载dll

  1. 定义一个类库,定义接口
csharp 复制代码
namespace Plugin
{
    public interface IPlugin
    {
        void EllisTest();
    }
}
  1. 定义另外一个类库,引用上面的类库,实现接口
csharp 复制代码
using Plugin;

namespace UserCustom
{
    public class Custom : IPlugin
    {
        public  void EllisTest()
        {
            Console.WriteLine("哈哈,今天这个天气挺好的");
        }
    }
}
  1. 定义API,使用assemble加载dll
csharp 复制代码
[HttpGet(Name = "test")]
public IActionResult DirectLoad()
{
    Assembly assembly = Assembly.LoadFrom("C:\\Users\\84977\\Desktop\\UserCustom.dll");

    var pluginType = assembly.GetTypes().FirstOrDefault(t => typeof(IPlugin).IsAssignableFrom(t) && !t.IsInterface && !t.IsAbstract);
    if (pluginType != null)
    {
        IPlugin plugin = (IPlugin)Activator.CreateInstance(pluginType);

        plugin.EllisTest();
    }
    return Ok();
}

[HttpGet(Name = "GetWeatherForecast")]
public IEnumerable<WeatherForecast> Get()
{
    string pluginPath = "C:\\Users\\84977\\Desktop\\UserCustom.dll";
    var pluginLoader = new PluginLoader();
    pluginLoader.LoadAndExecutePlugin(pluginPath);
    return Enumerable.Range(1, 5).Select(index => new WeatherForecast
    {
        Date = DateTime.Now.AddDays(index),
        TemperatureC = Random.Shared.Next(-20, 55),
        Summary = Summaries[Random.Shared.Next(Summaries.Length)]
    })
    .ToArray();
} 
  1. 使用AssemblyLoadContext 加载dll
csharp 复制代码
public class CustomAssemblyLoadContext : AssemblyLoadContext
    {
        public CustomAssemblyLoadContext() : base(isCollectible: true)
        {
        }

        protected override Assembly Load(AssemblyName assemblyName)
        {
            return null; // 返回 null 以使用默认的加载机制
        }
    }


    public class PluginLoader
    {
        public void LoadAndExecutePlugin(string pluginPath)
        {
            var context = new CustomAssemblyLoadContext();

            // 加载插件程序集
            var assembly = context.LoadFromAssemblyPath(pluginPath);
            // 查找实现了 IPlugin 接口的类型
            var pluginType = assembly.GetTypes().FirstOrDefault(t => typeof(IPlugin).IsAssignableFrom(t) && !t.IsInterface && !t.IsAbstract);

            if (pluginType != null)
            {
                // 创建插件实例并调用方法
                var plugin = (IPlugin)Activator.CreateInstance(pluginType);
               
                plugin.EllisTest();
            }
            assembly = null;
            GC.Collect();
            GC.WaitForPendingFinalizers();
            context.Unload();
            // 在此处,当 using 块结束时,AssemblyLoadContext 会被卸载,从而实现 DLL 的热卸载。
        }
    }
相关推荐
开开心心_Every10 天前
音频格式互转工具,支持Mp3ApeWavFlac互转
linux·运维·服务器·typescript·edge·pdf·asp.net
bugcome_com13 天前
【C# 数组详解】Array 定义、初始化、遍历、内存原理与面试高频问题
后端·c#·asp.net
铁甲前沿19 天前
一个月玩转MQTT(篇五:开发自己的MQTT WEB页面)
前端·mqtt·asp.net·mqtt web开发
weixin_4219947821 天前
依赖注入与中间件 - ASP.NET Core 核心概念
后端·中间件·asp.net
鱼是一只鱼啊22 天前
ASP.NET Core 集成腾讯云 COS 实现文件上传下载完整指南
云计算·asp.net·腾讯云·文件上传·cos
无风听海1 个月前
.NET10之ASP.NET Core的Filter管线
java·asp.net·.net
William_cl1 个月前
ASP.NET路由长度约束精讲:[HttpGet (“{name:minlength (3)}“)] 字符长度限制吃透,附避坑指南 + 实战代码
后端·asp.net
奥特曼打小白1 个月前
Microsoft SQL Server2025的下载、安装与配置——从环境、管理工具、配置管理器入手,解决VS2022ASP.NET网站项目中SqlDataSource控件找不到服务器的问题
sqlserver·asp.net
William_cl1 个月前
ASP.NET路由类型约束核心精讲:[HttpGet (“{id:int}“)] 整数约束吃透,附避坑指南 + 实战代码
后端·asp.net
步步为营DotNet1 个月前
深入理解ASP.NET Core Middleware:管道执行机制与高效应用
后端·asp.net