博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
动态加载dll,扩展系统功能
阅读量:6029 次
发布时间:2019-06-20

本文共 4253 字,大约阅读时间需要 14 分钟。

hot3.png

动态加载dll,主要是为了扩展功能,增强灵活性而实现的。主要通过xml配置,来获取所有要动态加载的dll,然后通过反射机制来调用dll中的类及其方法。

研究了一天,小有所得,写了一个简单的动态加载dll的通用模块,拿出来与大家分享一下:

using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Reflection;using System.Text;using System.Threading.Tasks;namespace DynamicLoadDLL{    ///     /// 动态加载dll    ///     public class LoadDLL    {        private Assembly ass = null;        ///         /// 加载dll        ///         /// dll文件路径        public LoadDLL(string dllPath)        {            this.ass = Assembly.LoadFrom(dllPath);                     //利用dll的路径加载(fullname)        }        ///         /// 返回反射的dll        ///         /// 
public Assembly GetAssembly() { return this.ass; } /// /// 获取所有类名 /// ///
public Type[] GetClass() { return ass.GetTypes(); } /// /// 获取程序集下的所有文件名 /// ///
public Module[] GetModules() { return ass.GetModules(); } /// /// 获取程序集清单文件表中的文件 /// ///
public FileStream[] GetFiles() { return ass.GetFiles(); } }}
这个是加载dll的,然后返回一个Assembly类型的一个反射值,如果该dll中有多个命名空间和类的话,就只用一个
Assembly类型的一个反射值即可以完成调用,否则每次生成一个类,都需要反射一次。IO操作相对而言是比较耗费CPU,影响效率的。

using System;using System.Collections.Generic;using System.Linq;using System.Reflection;using System.Text;using System.Threading.Tasks;namespace DynamicLoadDLL{    ///     /// 加载类    ///     public class LoadClass    {        private static LoadClass dlc = null;        private Type type;        private object obj = null;                                         //实例        ///         /// 加载dll        ///         /// dll引用        /// 类的命名空间        /// 类名称        private LoadClass(Assembly ass, string nameSpace, string classPath)        {            //加载dll后,需要使用dll中某类.            type = ass.GetType(nameSpace + "." + classPath);                                //利用类型的命名空间和名称获得类型            //需要实例化类型,才可以使用,参数可以人为的指定,也可以无参数,静态实例可以省略            obj = Activator.CreateInstance(type);                         //利用指定的参数实例话类型        }        ///         /// 加载dll        ///         /// dll引用        /// 类的命名空间        /// 类名称        public static LoadClass GetInstance(Assembly ass, string nameSpace, string classPath)        {            if (dlc == null)            {                dlc = new LoadClass(ass, nameSpace, classPath);            }            return dlc;        }        ///         /// 获取属性集        ///         /// 
返回属性值
public PropertyInfo[] GetAttrs() { //调用类型中的某个属性: PropertyInfo[] prop = type.GetProperties(); //通过属性名称获得属性 //返回属性集 return prop; } public MethodInfo[] GetMethods() { //调用类型中的方法: MethodInfo[] method = type.GetMethods(BindingFlags.NonPublic); //获得方法集 //返回方法集 return method; } /// /// 获取属性值 /// /// 属性名称 ///
返回属性值
public object GetAttrValue(string attrName) { //调用类型中的某个属性: PropertyInfo prop = type.GetProperty(attrName); //通过属性名称获得属性 //返回属性值 return prop.GetValue(obj); } /// /// 设置属性值 /// /// 属性名称 ///
返回属性值
public void SetAttrValue(string attrName, string attrValue) { //调用类型中的某个属性: PropertyInfo prop = type.GetProperty(attrName); //通过属性名称获得属性 //返回属性值 prop.SetValue(obj, attrValue); } /// /// 执行类方法 /// /// 方法名称 /// 参数 /// 参数类型 ///
public object GetMethod(string methodName, object[] paras,Type[] types) { //调用类型中的某个方法: MethodInfo method = type.GetMethod(methodName,types); //通过方法名称获得方法 //执行方法 return method.Invoke(obj, paras); } }}
上面这个类根据dll反射值,命名空间和类名,反射出一个具体的类,还提供了属性和方法的调用方法。很方便。

这些是我在研究插件编程时,顺带研究的,不太深入,但希望对你能有所帮助。

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://my.oschina.net/u/2260184/blog/518407

你可能感兴趣的文章
自定义key解决zabbix端口监听取值不准确的问题
查看>>
Go语言标准库之JSON编解码
查看>>
linux上架设l2tp+ipsec ***服务器
查看>>
curl指令的使用
查看>>
LNAMP第二版(nginx 1.2.0+apache 2.4.2+php 5.4)
查看>>
基于用户投票的排名算法(二):Reddit
查看>>
css3中变形与动画(一)
查看>>
[XMove-自主设计的体感解决方案] 系统综述
查看>>
变更 Linux、Ubuntu 时区、时间
查看>>
[共通]手机端网页开发问题及解决方法整理
查看>>
思科分发列表过滤路由(RIP)动态路由协议篇
查看>>
可登录的用户数量是1.6万个,软件的性能得到充分的考验
查看>>
[实战]MVC5+EF6+MySql企业网盘实战(23)——文档列表
查看>>
[译] ES2018(ES9)的新特性
查看>>
Java生成-zipf分布的数据集(自定义倾斜度,用作spark data skew测试)
查看>>
正则与sed,grep,awk三剑客
查看>>
诊断一句SQL不走索引的原因
查看>>
Linux pipe函数
查看>>
图片标注工具LabelImg使用教程
查看>>
(原創) 如何設計一個數位相框? (SOC) (Quartus II) (SOPC Builder) (Nios II) (TRDB-LTM) (DE2-70)...
查看>>