您的位置:首页 > 其它

通过DLL路径,实现动态调用动态链接库中指定类的(静态)方法和属性

2010-10-14 17:58 851 查看
注意:需要特别引入的名称空间 using System.Reflection;这个类还不是很完整,请多指正。

/*********************************************
*
* 作者:wyj
*
* 版权:slsoft QQ:395099917
*
* 日期:2010-10-14
*
**********************************************/
[Description("通过DLL路径,实现动态调用动态链接库中指定类的(静态)方法和属性")]
public class DynamicReflectDLL : MarshalByRefObject
{
#region fields
private string _dllPath;
#endregion

#region properties
public string DLLPath
{
get { return _dllPath; }
set { _dllPath = value; }
}
#endregion

#region funs
public DynamicReflectDLL(string dllPath)
{
_dllPath = dllPath;
}

private object CommonFun(object[] pars, object[] reflectPars,BindingFlags bFlags)
{
Assembly newDLL;
Type obj;
Object instObj;
try
{
//通过路径加载程序集
newDLL = Assembly.LoadFrom(@_dllPath);
//获取程序集的类型
obj = newDLL.GetType(pars[0].ToString());
//创建这个类型的一个实例
instObj = Activator.CreateInstance(obj);
//注意通过实例调用成员时要使用 BindingFlags.Instance
return obj.InvokeMember(pars[1].ToString(),
BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public | bFlags,
null,
instObj,
reflectPars);
}
catch { return null; }
finally
{
newDLL = null;
obj = null;
instObj = null;
}
}

private object CommonStaticFun(object[] pars, object[] reflectPars, BindingFlags bFlags)
{
Assembly newDLL;
Type obj;
try
{
newDLL = Assembly.LoadFrom(@_dllPath);
obj = newDLL.GetType(pars[0].ToString());
return obj.InvokeMember(pars[1].ToString(),
BindingFlags.DeclaredOnly | BindingFlags.Public
| BindingFlags.Static | bFlags,
null,
obj,
reflectPars);
}
catch { return null; }
finally
{
newDLL = null;
obj = null;
}
}
/// <summary>
/// 通过反射方式执行方法
/// </summary>
/// <param name="pars">参数列表(1.包含名称空间的类型名称 2.要调用的方法名)</param>
/// <param name="methodPars">要通过反射方式调用方法的参数列表</param>
/// <returns>通过反射执行方法的返回值</returns>
public object ExeMethodByReflect(object[] pars, object[] methodPars)
{
return CommonFun(pars, methodPars, BindingFlags.InvokeMethod);
}
/// <summary>
/// 通过反射方式执行静态方法
/// </summary>
/// <param name="pars">参数列表(1.包含名称空间的类型名称 2.要调用的方法名)</param>
/// <param name="methodPars">要通过反射方式调用方法的参数列表</param>
/// <returns>通过反射执行方法的返回值</returns>
public object ExeStaticMethodByReflect(object[] pars, object[] methodPars)
{
return CommonStaticFun(pars, methodPars, BindingFlags.InvokeMethod);
}
/// <summary>
/// 通过反射方式设置属性(无意义,因为每次修改的都是创建的新实例。)
/// </summary>
/// <param name="pars">参数列表(1.包含名称空间的类型名称 2.要设置的属性)</param>
/// <param name="propertyPars">要通过反射方式设置属性的新属性值</param>
public void SetPropertyByReflect(object[] pars, object[] propertyPars)
{
CommonFun(pars, propertyPars, BindingFlags.SetProperty);
}
/// <summary>
/// 通过反射方式获取属性
/// </summary>
/// <param name="pars">参数列表(1.包含名称空间的类型名称 2.要获取的属性)</param>
/// <return><</return>
public object GetPropertyByReflect(object[] pars)
{
return CommonFun(pars, null, BindingFlags.GetProperty);
}
/// <summary>
/// 通过反射方式设置静态属性
/// </summary>
/// <param name="pars">参数列表(1.包含名称空间的类型名称 2.要设置的属性)</param>
/// <param name="propertyPars">要通过反射方式设置属性的新属性值</param>
public void SetStaticPropertyByReflect(object[] pars, object[] propertyPars)
{
CommonStaticFun(pars, propertyPars, BindingFlags.NonPublic | BindingFlags.SetProperty);
}
/// <summary>
/// 通过反射方式获取静态属性
/// </summary>
/// <param name="pars">参数列表(1.包含名称空间的类型名称 2.要获取的属性)</param>
/// <return><</return>
public object GetStaticPropertyByReflect(object[] pars)
{
return CommonStaticFun(pars, null, BindingFlags.NonPublic | BindingFlags.GetProperty);
}
#endregion
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: