反射提供描述程序集、模块和类型的对象(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;
}