C#.NET 通过反射 Reflection 的方式调用外部 .dll 文件中的方法

.NET System.Reflection 命名空间,Assembly 类

发布用户:小梦

2023/04/06 11:15


.NET Framework 平台提供反射(Reflection)的特性,通过使用反射,我们可以调用不在本项目内的外部 .NET 程序集中的方法,反射特性能够用于解决一些联合开发项目中的耦合问题,更有利于项目的扩展和维护性,但是要注意使用反射的方式调用 .dll 中的方法时性能、效率会有一定程度的降低。

using System;
using System.Reflection;
using System.IO;

// 读取 .dll 文件
byte[] fileData = File.ReadAllBytes("D:\\file.dll");
Assembly assembly1 = Assembly.Load(fileData);

// 获取 Type
Type type1 = assembly1.GetType("namespace.type");

// 获取方法
MethodInfo method = type1.GetMethod("method");

// 创建一个实例
object activator = Activator.CreateInstance(type1);

// 执行方法并获取返回结果
object result = method.Invoke(activator, null);

载入程序集是通过读取为字节数组的方式,这样可以避免 Assembly.LoadFile 方法造成的 .dll 文件被占用问题,这里需要使用绝对路径;获取 Type 时需要在前面加上命名空间,这里的 Type 可以理解为实际代码中的 Class,获取方法只需提供方法名称即可;对于静态方法的调用可以不必使用 Activator 类创建实例,所以 Invoke 方法的第一个参数可以为 null,Invoke 方法的第二个参数是 object[] 类型,表示传递给该方法的参数集合,方法被调用后返回的结果是以 object 类型保存的,在实际情况下当然还需要一个转换操作。



代码写多了,脑力不够用了,请我喝杯咖啡提提神 ☕

警告!禁止网络诈骗、非法集资、非法套现等法律外的缘由转账汇款,你的赞赏转账请考虑再三后支付,此收款不作任何形式的退款。





金额:

* 支付宝支付后如果没有自动返回请手动返回此页并刷新。



* 在线内容服务不支持任何形式的退款/退费操作;支付后的订单记录可以在“用户主页 - 用户订单中心”查看。

此网站可能不完全兼容您目前的浏览器!
此页随时可能被替换下线,请不要依赖此页功能!
此页正在维护更新,可能会出现错误或卡顿。
通知 & 公告

暂时还没有消息