C#靜態加載dll擴大體系功效的辦法。本站提示廣大學習愛好者:(C#靜態加載dll擴大體系功效的辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是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#法式設計有所贊助。