当前位置: 首页 > news >正文

Asp.net Core 反射加载dll

  1. 定义一个类库,定义接口
namespace Plugin
{public interface IPlugin{void EllisTest();}
}
  1. 定义另外一个类库,引用上面的类库,实现接口
using Plugin;namespace UserCustom
{public class Custom : IPlugin{public  void EllisTest(){Console.WriteLine("哈哈,今天这个天气挺好的");}}
}
  1. 定义API,使用assemble加载dll
[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
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 的热卸载。}}

相关文章:

  • 在C++中,工厂模式的思考(《C++20设计模式》及常规设计模式对比)
  • Word中输入文字时,后面的文字消失
  • 如何在OpenEuler 上快速部署一套Zabbix7.0监控系统
  • 性能测试方法与工具比较
  • 云计算 | 期末梳理(上)
  • 零知识证明技术:隐私保护的利器
  • 【原创教程】一次搞定伺服原点问题(进阶篇)
  • 【图片知识】现在各种平台为什么开始使用 webp格式的图片 而不是传统的jpg或者png
  • python 笔试面试八股(自用版~)
  • git基本使用(二):git分支的操作命令
  • 【PYG】Cora数据集分析argmax(dim=1)输出
  • 初学51单片机之简易电子密码锁及PWM应用扩展
  • 二维码登录的原理
  • vue根据文字长短展示跑马灯效果
  • Kafka-服务端-副本同步-源码流程
  • (三)从jvm层面了解线程的启动和停止
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • ES6核心特性
  • express如何解决request entity too large问题
  • gf框架之分页模块(五) - 自定义分页
  • JavaScript标准库系列——Math对象和Date对象(二)
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • LeetCode18.四数之和 JavaScript
  • Linux链接文件
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • React-redux的原理以及使用
  • Web设计流程优化:网页效果图设计新思路
  • Windows Containers 大冒险: 容器网络
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 浮动相关
  • 简析gRPC client 连接管理
  • 深度学习中的信息论知识详解
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 用Python写一份独特的元宵节祝福
  • Hibernate主键生成策略及选择
  • ionic入门之数据绑定显示-1
  • MPAndroidChart 教程:Y轴 YAxis
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • #pragma once
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • (12)目标检测_SSD基于pytorch搭建代码
  • (20050108)又读《平凡的世界》
  • (3) cmake编译多个cpp文件
  • (pojstep1.1.2)2654(直叙式模拟)
  • (二)JAVA使用POI操作excel
  • (一)SpringBoot3---尚硅谷总结
  • (一)为什么要选择C++
  • (转) Android中ViewStub组件使用
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .NET Core 成都线下面基会拉开序幕
  • .Net mvc总结