国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#動態加載dll擴展系統功能的方法

2020-01-24 01:54:14
字體:
來源:轉載
供稿:網友

本文實例講述了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#程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 无极县| 隆安县| 祁门县| 玉树县| 疏勒县| 个旧市| 泰宁县| 昌黎县| 南汇区| 区。| 延川县| 项城市| 信阳市| 漯河市| 定远县| 手游| 遂川县| 吉木萨尔县| 苍南县| 探索| 广饶县| 福贡县| 西华县| 宁津县| 龙陵县| 丰宁| 当涂县| 深圳市| 南开区| 吴旗县| 资兴市| 乐山市| 沈丘县| 铜川市| 郸城县| 屏边| 宣汉县| 宜川县| 罗甸县| 民勤县| 罗田县|