当前位置:首页 > 技术心得 > 正文内容

C# 动态加载DLL 通过反射 调用参数、方法、窗体

xjtudll4年前 (2022-03-20)技术心得5160

.net中常会用到动态加载DLL,而DLL中可能包含各种参数、方法、窗体,如何来调用动态加载这些参数、方法、窗体呢?

在C#中,我们要使用反射,首先要搞清楚以下命名空间中几个类的关系:

System.Reflection命名空间

(1)   AppDomain:应用程序域,可以将其理解为一组程序集的逻辑容器

(2)   Assembly:程序集类

(3)   Module:模块类

(4)   Type:使用反射得到类型信息的最核心的类

他们之间是一种从属关系,也就是说,一个AppDomain可以包含N个Assembly,一个Assembly可以包含N个Module,而一个Module可以包含N个Type.

在程序中,如果我们要动态加载一个程序集有以下种方式可以使用,分别是Load、LoadFrom、LoadFile、LoadWithPartialName方法.

其中着重讲解以下Assembly.LoadFile 与 Assembly.LoadFrom的区别

1、Assembly.LoadFile只载入相应的dll文件,比如Assembly.LoadFile("abc.dll"),则载入abc.dll,假如abc.dll中引用了def.dll的话,def.dll并不会被载入。

Assembly.LoadFrom则不一样,它会载入dll文件及其引用的其他dll,比如上面的例子,def.dll也会被载入。

2、用Assembly.LoadFrom载入一个Assembly时,会先检查前面是否已经载入过相同名字的Assembly,比如abc.dll有两个版本(版本1在目录1下,版本2放在目录2下),程序一开始时载入了版本1,当使用Assembly.LoadFrom("2\\abc.dll")载入版本2时,不能载入,而是返回版本1。Assembly.LoadFile的话则不会做这样的检查,比如上面的例子换成Assembly.LoadFile的话,则能正确载入版本2。

LoadFile:加载指定路径上的程序集文件的内容。LoadFrom: 根据程序集的文件名加载程序集文件的内容。

最后是调用方法

Assembly outerAsm = Assembly.LoadFrom(@"urPath\MyDLL.dll");

调用DLL类中的方法

Type type = outerAsm .GetType("MyDLL.MyClass");//调用类型
MethodInfo method = type.GetMethod("MyVoid");//调用方法

//如果需要传参数

object[] paramertors = new object[] { "3087", "2005" };//参数集合
object test = method.Invoke(null, paramertors);//Invoke调用方法

调用DLL中窗体

Type outerForm = outerAsm.GetType("MyForm", false);//找到指定窗口

(Activator.CreateInstance(outerForm) as Form).Show();//转换成窗体类,显示

扫描二维码推送至手机访问。

版权声明:本文由鸟的天空发布,如需转载请注明出处。

本文链接:http://www.xjtudll.cn/Exp/638/

标签: C#
分享给朋友:

“C# 动态加载DLL 通过反射 调用参数、方法、窗体” 的相关文章

金蝶K3设置套打ActiveX 部件不能创建对象

金蝶K3设置套打ActiveX 部件不能创建对象

处理方式: 打开CMD命令提示符,执行以下命令注册加载该程序集即可解决。 C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe "C:\Program Files (x86)\Kingdee\K3ERP\K3Exc...

VS C#错误 未能找到类型或命名空间名称"xxxxxx"的真正原因

问题描述: 明明已经引用了项目(或DLL),但一编译就提示:未能找到类型或者命名空间。 根本原因还是引用的问题,引用错了,然后VS在这上面提示又不够智能 第一种可能: 这种可能性很好排查,A项目所使用的.net版本为3.5,B项目为4.0,那么A引用B是肯定要出事的 而错误提示就是那坑爹的未能找到类...

xcopy用法中的排除复制

利用xcopy进行排除复制 xcopy /e /s /h /exclude:uncopy.txt  mail  mail_x mail为源文件夹,mail_x为目标文件夹 uncopy.txt(所要排除的文件以及文件夹关键字)如:内容如下,表示排除文件夹或文件名中含有以下字眼的内...

如何使用Dell PowerEdge RAID控制器(PERC)初始化和创建虚拟磁盘/阵列

如何使用Dell PowerEdge RAID控制器(PERC)初始化和创建虚拟磁盘/阵列

本文介绍了使用PowerEdge RAID控制器(PERC)的Dell Bios实用程序创建和初始化虚拟阵列或虚拟磁盘(VD)的步骤。 注意:下面的说明适用于以下PowerEdge RAID控制器(PERC):5(i+e)、6(i+e)、H700、H800、H310、H710、H810、 H330、...

聚合物电池的容量如何计算

参考资料: http://www.18650.com.cn/news/15373393.html 1、测量开路电压 电池端电压和剩余容量之间有一个确定的关系,测量电池端电压即可估算其剩余容量。 这种方法的局限是: 1)对于不同厂商生产的电池,其开路电压与容量之间的关系各不相同。 2)只有通过测...

NodeMCU无限打印:wifi_event_monitor_handle_event_cb is called

NodeMCU一直输出: wifi event monitor handle event cb is called wifi event monitor handle event cb is called wifi event monitor handle event cb is ca...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。