通过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 }
相关文章推荐
- dll动态链接库之用类写配置文件和调用判断方法接口的实现中遇到的若干问题
- gcc指定库路径,头文件路径以及实现静态动态链接 .
- 创建Bean的三种方式 在大多数情况下,Spring容器直接通过new关键字调用构造器来创建Bean实例,而class属性指定Bean实例的实现类,但这不是实例化Bean的唯一方法。实际上,Sprin
- 转—gcc指定库路径,头文件路径以及实现静态动态链接
- C#实现反射调用动态加载的DLL文件中的方法
- Action配置(动态方法调用、为Action元素指定method属性、通配符映射)
- vb.net静态动态调用c++dll的方法
- VS或者Qt调用外部动态链接库dll的方法
- C++调用DLL有两种方法——静态调用和动态调用
- c# 动态加载dll文件,并实现调用其中的方法
- Python通过属性手段实现只允许调用一次的方法
- java web JNative调用dll动态链接库:和注意方法
- 通过img标签调用实现静态页面访问次数统计的简单方法
- Delphi调用C++编写的动态链接库dll的方法
- c# 动态加载dll文件,并实现调用其中的方法(推荐)
- MFC创建动态链接库DLL并调用方法详解
- JS+JSP通过img标签调用实现静态页面访问次数统计的方法
- C#实现反射调用动态加载的DLL文件中的方法
- C#实现反射调用动态加载的DLL文件中的方法
- LINQ 通过动态生成lambda表达式,实现根据指定属性名称对序列进行排序