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 的热卸载。}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/39262.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二刷力扣——DP算法(子序列问题)

300. 最长递增子序列 定义是以本元素结尾&#xff0c;所以公式初始化都好弄。但是太慢 class Solution {public int lengthOfLIS(int[] nums) {int nnums.length;int[] dp new int[n];//以自己结尾的最长递增子序列dp[0]1;int maxzi1;for(int i1;i<n;i){dp[i]1;for(int j…

QT中QDomDocument读写XML文件

一、XML文件 <?xml version"1.0" encoding"UTF-8"?> <Begin><Type name"zhangsan"><sex>boy</sex><school>Chengdu</school><age>18</age><special>handsome</special>&l…

【YOLOv5进阶】——引入注意力机制-以SE为例

声明&#xff1a;笔记是做项目时根据B站博主视频学习时自己编写&#xff0c;请勿随意转载&#xff01; 一、站在巨人的肩膀上 SE模块即Squeeze-and-Excitation 模块&#xff0c;这是一种常用于卷积神经网络中的注意力机制&#xff01;&#xff01; 借鉴代码的代码链接如下&a…

在C#中使用RabbitMQ做个简单的发送邮件小项目 _

前言 好久没有做项目了&#xff0c;这次做一个发送邮件的小项目。发邮件是一个比较耗时的操作&#xff0c;之前在我的个人博客里面回复评论和友链申请是会通过发送邮件来通知对方的&#xff0c;不过当时只是简单的进行了异步操作。那么这次来使用RabbitMQ去统一发送邮件&#x…

vue中路由来回切换页面直接卡死

今天发现一个很严重的问题&#xff0c;项目好不容易做好了&#xff0c;结果页面多了&#xff0c;切换之后卡死。页面所有的交互效果都失效了。 排查了许久的错误原因最后发现原来是路由名称重复了。 如上图当页面跳转到riskdetails详细页面之后&#xff0c;框架则被这个详情页…

随机森林R语言预测工具

随机森林&#xff08;Random Forest&#xff09;是一种基于决策树的集成学习方法&#xff0c;它通过构建多个决策树并集成它们的预测结果来提高预测的准确性。在R语言中&#xff0c;我们可以使用randomForest包来构建和训练随机森林模型。以下是对随机森林的详细介绍以及使用R语…

java高仿真数据生成器-需要的拿去

java高仿真数据生成器源码-需要的拿去 nit-random-tools 介绍&#xff1a;高仿真数据生成器 逆天开源 java 证号码, 姓名&#xff0c;职业, 日期&#xff0c;手机号 生成器 功能列表 编号功能描述class1号 生成器NitIdcardGenerator2姓名 生成器NitChineseNameGenerator3职…

node.lib下载失败,手动下载并配置

在无网络环境&#xff0c;或者网络不好的环境&#xff0c;node.lib会下载失败&#xff0c;此时可手动下载并进行配置。 我们以 node16.17.0 为例&#xff1a; 下载地址 分别下载node.lib和headers https://registry.npmmirror.com/-/binary/node/v16.17.0/win-x64/node.lib…

目标检测算法的技术革新与应用案例

引言 目标检测作为计算机视觉领域中的一项关键技术&#xff0c;近年来取得了显著进展。从传统的基于特征的方法到如今的深度学习算法&#xff0c;目标检测技术在准确性、速度和鲁棒性上均实现了大幅提升。本文将深入探讨目标检测算法的技术原理、发展历程、最新进展以及实际应…

HarmonyOS--开发者证书考试地址

初级证书&#xff1a;华为开发者学堂 高级证书&#xff1a;华为开发者学堂 对应课程&#xff1a;华为开发者学堂

Linux rpm与yum

一、rpm包管理 rpm用于互联网下载包的打包及安装工具&#xff0c;它包含在某些Linux分发版中。它生成具有.RPM扩展名的文件。RPM是RedHat Package Manager (RedHat软件包管理工具&#xff09;的缩写&#xff0c;类似windows的setup.exe&#xff0c;这一文件格式名称虽然打上了R…

办理北京公司注销流程和步骤说明

公司的生命周期是多变的&#xff0c;有时候&#xff0c;业务可能会结束或者出现其他原因&#xff0c;需要注销公司。注销公司是一个复杂的法律过程&#xff0c;需要遵循一系列的步骤和提交特定的材料。下面我们将详细介绍北京注销公司的流程以及需要准备的材料&#xff0c;以帮…

《等保测评实战指南:从评估到加固的全程解析》

在当今数字化时代&#xff0c;信息安全已成为企业生存与发展的基石。随着网络攻击手段的不断演变和复杂度的提升&#xff0c;信息系统等级保护&#xff08;简称“等保”&#xff09;作为国家信息安全保障体系的重要组成部分&#xff0c;其重要性日益凸显。《等保测评实战指南&a…

私有云统一多云管理平台主要服务内容

私有云统一多云管理平台&#xff0c;作为企业IT架构现代化的关键组成部分&#xff0c;旨在为企业提供高效、灵活、安全的云计算资源管理解决方案。这类平台通过整合和优化不同云环境(包括私有云、公有云、混合云)的管理&#xff0c;帮助企业打破云孤岛&#xff0c;实现资源的统…

clickhouse-client 数据导入导出

ClickHouse提供了clickhouse-client客户端可用于数据的快速导入导出 官方文档&#xff1a; Inserting Data from a File JSONL 格式 导出 clickhouse-client -h 127.0.0.1 --port 9000 -u default --password XXX -d default \--query "SELECT * from default.doc_typ…

【游戏引擎之路】登神长阶(五)

5月20日-6月4日&#xff1a;攻克2D物理引擎。 6月4日-6月13日&#xff1a;攻克《3D数学基础》。 6月13日-6月20日&#xff1a;攻克《3D图形教程》。 6月21日-6月22日&#xff1a;攻克《Raycasting游戏教程》。 6月23日-6月30日&#xff1a;攻克《Windows游戏编程大师技巧》。 …

【Qwen2部署实战】Qwen2初体验:用Transformers打造智能聊天机器人

系列篇章&#x1f4a5; No.文章1【Qwen部署实战】探索Qwen-7B-Chat&#xff1a;阿里云大型语言模型的对话实践2【Qwen2部署实战】Qwen2初体验&#xff1a;用Transformers打造智能聊天机器人3【Qwen2部署实战】探索Qwen2-7B&#xff1a;通过FastApi框架实现API的部署与调用4【Q…

从任意用户注册到任意密码重置

写在最前面一句话 To be or not to be ,it‘s a question . 哎呀&#xff0c;放错台词了&#xff0c;应该是 true or false , 在最近的测试中遇到了一个很有趣的点 “将 false 改为true ”就可以成功绕过验证码了。 T rue or false &#xff1f;&#xff1f;&#xff1f; …

Oracle PL / SQL包

在实践中&#xff0c;您很少创建独立的存储函数或过程。 相反&#xff0c;你会使用一个包。 包可以一起组织相关的功能和过程&#xff0c;例如创建库&#xff0c;但在PL / SQL中&#xff0c;库被称为包。 PL / SQL包有两个部分&#xff1a; 包规格包装体 包规范是包的公共…

使用fabric8操作k8s

文章目录 一、引入fabric包二、认证1、使用config文件认证2、使用oauthtoken认证 三、pod的查询和遍历四、命名空间的创建和删除五、deployment的创建和删除部分参数说明1、resourceRequirements2、containerPorts3、envVarList4、volumeMounts和volumeList5、nodeAffinity 六、…