C#動(dòng)態(tài)加載dll擴(kuò)展系統(tǒng)功能的方法
本文實(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)文章
C#操作圖片讀取和存儲(chǔ)SQLserver實(shí)現(xiàn)代碼
用C#將Image轉(zhuǎn)換成byte[]并插入數(shù)據(jù)庫/將圖片數(shù)據(jù)從SQLserver中取出來并顯示到pictureBox控件上,接下來將為你詳細(xì)介紹下實(shí)現(xiàn)步驟,感興趣的你可以參考下2013-03-03C#請(qǐng)求http向網(wǎng)頁發(fā)送接收數(shù)據(jù)的方法
這篇文章主要為大家詳細(xì)介紹了C#請(qǐng)求http向網(wǎng)頁發(fā)送數(shù)據(jù)、網(wǎng)頁接收的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07C# 批量生成隨機(jī)密碼必須包含數(shù)字和字母并用加密算法加密
這篇文章主要介紹了C# 批量生成隨機(jī)密碼必須包含數(shù)字和字母并用加密算法加密,需要的朋友參考下2017-01-01解決unity rotate旋轉(zhuǎn)物體 限制物體旋轉(zhuǎn)角度的大坑
這篇文章主要介紹了解決unity rotate旋轉(zhuǎn)物體 限制物體旋轉(zhuǎn)角度的大坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-04-04C#中的靜態(tài)字段double.Epsilon實(shí)例詳解
double.Epsilon 是C#中的一個(gè)靜態(tài)字段,表示 double 數(shù)據(jù)類型的最小可表示的正數(shù)值,這篇文章主要介紹了C#中的靜態(tài)字段double.Epsilon的相關(guān)知識(shí),需要的朋友可以參考下2024-01-01