反射提供描述程序集、模块和类型的对象(Type 类型)。 可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型,然后调用其方法或访问器字段和属性。 如果代码中使用了特性,可以利用反射来访问它们
namespace assembly_name { public class assembly_class { private string m_strPara; public assembly_class(string strPara) { this.m_strPara=strPara; } public string assembly_Test(Dictionary<string, string> dictPara) { //do something return "my result"; } } }
上边写一个测试类,名称空间是assembly_name,类名是assembly_class,类名下有个方法assembly_Test参数是字典类型,并且返回值是string类型;在我本地生成了这个类,生成后的dll假设为assembly.dll;下文中的Test方法反射调用了dll中的assembly_Test方法
public virtual string Test(Dictionary<string, string> dictPara) { string result = string.Empty; try { string strPara = "this is parameter"; //加载程序集(dll文件地址),使用Assembly类 //Assembly assembly = Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirectory + "assembly.dll"); //这种方式会导致dll组件被占用故不采用该方式 byte[] file = System.IO.File.ReadAllBytes(AppDomain.CurrentDomain.BaseDirectory + "assembly.dll"); System.Reflection.Assembly assembly = System.Reflection.Assembly.Load(file); //获取类型,参数(名称空间+类) Type type = assembly.GetType("assembly_name.assembly_class"); //创建该对象的实例,object类型,参数(名称空间+类) object instance = assembly.CreateInstance("assembly_name.assembly_class", true, System.Reflection.BindingFlags.Default, null, new object[] { strPara }, null, null); //方法参数类型和参数 Type[] params_type = { typeof(Dictionary<string, string>) }; Object[] params_obj = { dictPara }; //执行方法 result = (string)type.GetMethod("GetAccessory", params_type).Invoke(instance, params_obj); } catch (Exception ex) { throw ex; } return result; }