欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#動(dòng)態(tài)加載dll擴(kuò)展系統(tǒng)功能的方法

 更新時(shí)間:2015年04月27日 15:04:21   作者:依山帶水  
這篇文章主要介紹了C#動(dòng)態(tài)加載dll擴(kuò)展系統(tǒng)功能的方法,涉及C#動(dòng)態(tài)加載dll擴(kuò)展的相關(guān)技巧,需要的朋友可以參考下

本文實(shí)例講述了C#動(dòng)態(tài)加載dll擴(kuò)展系統(tǒng)功能的方法。分享給大家供大家參考。具體分析如下:

動(dòng)態(tài)加載dll,主要是為了擴(kuò)展功能,增強(qiáng)靈活性而實(shí)現(xiàn)的。主要通過xml配置,來獲取所有要?jiǎng)討B(tài)加載的dll,然后通過反射機(jī)制來調(diào)用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>
 /// 動(dòng)態(tài)加載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();
  }
 }
}

這個(gè)是加載dll的,然后返回一個(gè)Assembly類型的一個(gè)反射值,如果該dll中有多個(gè)命名空間和類的話,就只用一個(gè)Assembly類型的一個(gè)反射值即可以完成調(diào)用,否則每次生成一個(gè)類,都需要反射一次。IO操作相對(duì)而言是比較耗費(fèi)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;
  //實(shí)例
  /// <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);
   //利用類型的命名空間和名稱獲得類型
   //需要實(shí)例化類型,才可以使用,
   //參數(shù)可以人為的指定,也可以無參數(shù),靜態(tài)實(shí)例可以省略
   obj = Activator.CreateInstance(type);
  //利用指定的參數(shù)實(shí)例話類型
  }
  /// <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()
  {
   //調(diào)用類型中的某個(gè)屬性:
   PropertyInfo[] prop = type.GetProperties();
   //通過屬性名稱獲得屬性
   //返回屬性集
   return prop;
  }
  public MethodInfo[] GetMethods()
  {
   //調(diào)用類型中的方法:
   MethodInfo[] method = type.GetMethods(BindingFlags.NonPublic);
   //獲得方法集
   //返回方法集
   return method;
  }
  /// <summary>
  /// 獲取屬性值
  /// </summary>
  /// <param name="attrName">屬性名稱</param>
  /// <returns>返回屬性值</returns>
  public object GetAttrValue(string attrName)
  {
   //調(diào)用類型中的某個(gè)屬性:
   PropertyInfo prop = type.GetProperty(attrName);
   //通過屬性名稱獲得屬性
   //返回屬性值
   return prop.GetValue(obj);
  }
  /// <summary>
  /// 設(shè)置屬性值
  /// </summary>
  /// <param name="attrName">屬性名稱</param>
  /// <returns>返回屬性值</returns>
  public void SetAttrValue(string attrName, string attrValue)
  {
   //調(diào)用類型中的某個(gè)屬性:
   PropertyInfo prop = type.GetProperty(attrName);
   //通過屬性名稱獲得屬性
   //返回屬性值
   prop.SetValue(obj, attrValue);
  }
  /// <summary>
  /// 執(zhí)行類方法
  /// </summary>
  /// <param name="methodName">方法名稱</param>
  /// <param name="paras">參數(shù)</param>
  /// <param name="types">參數(shù)類型</param>
  /// <returns></returns>
  public object GetMethod(string methodName, object[] paras,Type[] types)
  {
   //調(diào)用類型中的某個(gè)方法:
   MethodInfo method = type.GetMethod(methodName,types);
   //通過方法名稱獲得方法
   //執(zhí)行方法
   return method.Invoke(obj, paras);
  }
 }
}

上面這個(gè)類根據(jù)dll反射值,命名空間和類名,反射出一個(gè)具體的類,還提供了屬性和方法的調(diào)用方法。很方便。

這些是我在研究插件編程時(shí),順帶研究的,不太深入。

希望本文所述對(duì)大家的C#程序設(shè)計(jì)有所幫助。

相關(guān)文章

最新評(píng)論