软件编程
位置:首页>> 软件编程>> C#编程>> C#动态加载dll扩展系统功能的方法

C#动态加载dll扩展系统功能的方法

作者:依山带水  发布时间:2022-08-08 23:23:15 

标签:C#,dll扩展

本文实例讲述了C#动态加载dll扩展系统功能的方法。分享给大家供大家参考。具体分析如下:

动态加载dll,主要是为了扩展功能,增强灵活性而实现的。主要通过xml配置,来获取所有要动态加载的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
{
/// <summary>
/// 动态加载dll
/// </summary>
public class LoadDLL
{
 private Assembly ass = null;
 /// <summary>
 /// 加载dll
 /// </summary>
 /// <param name="dllPath">dll文件路径</param>
 public LoadDLL(string dllPath)
 {
  this.ass = Assembly.LoadFrom(dllPath);
 //利用dll的路径加载(fullname)
 }
 /// <summary>
 /// 返回反射的dll
 /// </summary>
 /// <returns></returns>
 public Assembly GetAssembly()
 {
  return this.ass;
 }
 /// <summary>
 /// 获取所有类名
 /// </summary>
 /// <returns></returns>
 public Type[] GetClass()
 {
  return ass.GetTypes();
 }
 /// <summary>
 /// 获取程序集下的所有文件名
 /// </summary>
 /// <returns></returns>
 public Module[] GetModules()
 {
  return ass.GetModules();
 }
 /// <summary>
 /// 获取程序集清单文件表中的文件
 /// </summary>
 /// <returns></returns>
 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
{
/// <summary>
/// 加载类
/// </summary>
public class LoadClass
{
 private static LoadClass dlc = null;
 private Type type;
 private object obj = null;
 //实例
 /// <summary>
 /// 加载dll
 /// </summary>
 /// <param name="ass">dll引用</param>
 /// <param name="nameSpace">类的命名空间</param>
 /// <param name="classPath">类名称</param>
 private LoadClass(Assembly ass, string nameSpace, string classPath)
 {
  //加载dll后,需要使用dll中某类.
  type = ass.GetType(nameSpace + "." + classPath);
  //利用类型的命名空间和名称获得类型
  //需要实例化类型,才可以使用,
  //参数可以人为的指定,也可以无参数,静态实例可以省略
  obj = Activator.CreateInstance(type);
 //利用指定的参数实例话类型
 }
 /// <summary>
 /// 加载dll
 /// </summary>
 /// <param name="ass">dll引用</param>
 /// <param name="nameSpace">类的命名空间</param>
 /// <param name="classPath">类名称</param>
 public static LoadClass GetInstance(Assembly ass, string nameSpace, string classPath)
 {
  if (dlc == null)
  {
   dlc = new LoadClass(ass, nameSpace, classPath);
  }
  return dlc;
 }
 /// <summary>
 /// 获取属性集
 /// </summary>
 /// <returns>返回属性值</returns>
 public PropertyInfo[] GetAttrs()
 {
  //调用类型中的某个属性:
  PropertyInfo[] prop = type.GetProperties();
  //通过属性名称获得属性
  //返回属性集
  return prop;
 }
 public MethodInfo[] GetMethods()
 {
  //调用类型中的方法:
  MethodInfo[] method = type.GetMethods(BindingFlags.NonPublic);
  //获得方法集
  //返回方法集
  return method;
 }
 /// <summary>
 /// 获取属性值
 /// </summary>
 /// <param name="attrName">属性名称</param>
 /// <returns>返回属性值</returns>
 public object GetAttrValue(string attrName)
 {
  //调用类型中的某个属性:
  PropertyInfo prop = type.GetProperty(attrName);
  //通过属性名称获得属性
  //返回属性值
  return prop.GetValue(obj);
 }
 /// <summary>
 /// 设置属性值
 /// </summary>
 /// <param name="attrName">属性名称</param>
 /// <returns>返回属性值</returns>
 public void SetAttrValue(string attrName, string attrValue)
 {
  //调用类型中的某个属性:
  PropertyInfo prop = type.GetProperty(attrName);
  //通过属性名称获得属性
  //返回属性值
  prop.SetValue(obj, attrValue);
 }
 /// <summary>
 /// 执行类方法
 /// </summary>
 /// <param name="methodName">方法名称</param>
 /// <param name="paras">参数</param>
 /// <param name="types">参数类型</param>
 /// <returns></returns>
 public object GetMethod(string methodName, object[] paras,Type[] types)
 {
  //调用类型中的某个方法:
  MethodInfo method = type.GetMethod(methodName,types);
  //通过方法名称获得方法
  //执行方法
  return method.Invoke(obj, paras);
 }
}
}

上面这个类根据dll反射值,命名空间和类名,反射出一个具体的类,还提供了属性和方法的调用方法。很方便。

这些是我在研究插件编程时,顺带研究的,不太深入。

希望本文所述对大家的C#程序设计有所帮助。

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com