利用反射从程序集dll中动态调用方法(附demo下载)
在某些应用场景下我们需要动态调用某些程序集中的方法,例如某些大型产品中集成子产品、子项目或第三方产品的功能,有一种方式是通过数据持久化的形式来,数据持久化可能是用关系数据库或XML等存储程序集名称、命名空间、类名、方法名、参数类型及值等,这样通过反射结合业务逻辑就可以做出非常好的解耦的组件,这里暂时不考虑持久化和业务逻辑,只是单纯的引入一个demo来实现利用反射动态调用dll中的方法。主要步骤总结如下:
1、获取程序集的文件名或路径,加载程序集;
Assembly assembly = null; string appPath = Assembly.GetExecutingAssembly().Location; appPath = appPath.Substring(0, appPath.LastIndexOf('\\') + 1); // 1、获取程序集的文件名或路径,加载程序集 assembly = Assembly.LoadFrom(appPath + "FactRefect.dll");
2、获取程序集实例中具有指定名称的 System.Type 对象;
Type type = null; // 2、获取程序集实例中具有指定名称的 System.Type 对象 type = assembly.GetType("FactRefect.RefectionTest");
3、得到type的target类实例;
Object obj = null; // 3、得到target类实例 obj = type.InvokeMember(null, BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.CreateInstance, null, null, null);
4、调用type 类实例中的方法;
// 4、先调用RefectionTest类中的Set方法,设置x和y值分别为1和2 type.InvokeMember("Set", BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.InvokeMethod, null, obj, new object[] { 1, 2 }); // 5、再调用RefectionTest类中的Show方法,来打印出x和y值 type.InvokeMember("Show", BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.InvokeMethod, null, obj, null);
Demo源码下载:RefectionTest.zip
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构