C#動態(tài)加載dll擴(kuò)展系統(tǒng)功能的方法
本文實(shí)例講述了C#動態(tài)加載dll擴(kuò)展系統(tǒng)功能的方法。分享給大家供大家參考。具體分析如下:
動態(tài)加載dll,主要是為了擴(kuò)展功能,增強(qiáng)靈活性而實(shí)現(xiàn)的。主要通過xml配置,來獲取所有要動態(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>
/// 動態(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();
}
}
}
這個是加載dll的,然后返回一個Assembly類型的一個反射值,如果該dll中有多個命名空間和類的話,就只用一個Assembly類型的一個反射值即可以完成調(diào)用,否則每次生成一個類,都需要反射一次。IO操作相對而言是比較耗費(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)用類型中的某個屬性:
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)用類型中的某個屬性:
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)用類型中的某個屬性:
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)用類型中的某個方法:
MethodInfo method = type.GetMethod(methodName,types);
//通過方法名稱獲得方法
//執(zhí)行方法
return method.Invoke(obj, paras);
}
}
}
上面這個類根據(jù)dll反射值,命名空間和類名,反射出一個具體的類,還提供了屬性和方法的調(diào)用方法。很方便。
這些是我在研究插件編程時,順帶研究的,不太深入。
希望本文所述對大家的C#程序設(shè)計(jì)有所幫助。
相關(guān)文章
C#操作圖片讀取和存儲SQLserver實(shí)現(xiàn)代碼
用C#將Image轉(zhuǎn)換成byte[]并插入數(shù)據(jù)庫/將圖片數(shù)據(jù)從SQLserver中取出來并顯示到pictureBox控件上,接下來將為你詳細(xì)介紹下實(shí)現(xiàn)步驟,感興趣的你可以參考下2013-03-03
C#請求http向網(wǎng)頁發(fā)送接收數(shù)據(jù)的方法
這篇文章主要為大家詳細(xì)介紹了C#請求http向網(wǎng)頁發(fā)送數(shù)據(jù)、網(wǎng)頁接收的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07
C# 批量生成隨機(jī)密碼必須包含數(shù)字和字母并用加密算法加密
這篇文章主要介紹了C# 批量生成隨機(jī)密碼必須包含數(shù)字和字母并用加密算法加密,需要的朋友參考下2017-01-01
解決unity rotate旋轉(zhuǎn)物體 限制物體旋轉(zhuǎn)角度的大坑
這篇文章主要介紹了解決unity rotate旋轉(zhuǎn)物體 限制物體旋轉(zhuǎn)角度的大坑,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04
C#中的靜態(tài)字段double.Epsilon實(shí)例詳解
double.Epsilon 是C#中的一個靜態(tài)字段,表示 double 數(shù)據(jù)類型的最小可表示的正數(shù)值,這篇文章主要介紹了C#中的靜態(tài)字段double.Epsilon的相關(guān)知識,需要的朋友可以參考下2024-01-01

