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#法式設計有所贊助。