//创建该对象的实例,object类型,参数(命名空间.类) object instance = assembly . CreateInstance ( "namespace.ClassName" ) ; //设置要调用方法中的参数类型,Type[]类型,如果有多个参数课追加 //假设要调用的方法只有一个String类型的参数 Type [ ] paramsType = new Type [ 1 ] ; paramsType [ 0 ] = Type . GetType ( "System.String" ) ; //设置要调用方法方法中的参数值,同上可追加 Object [ ] paramsObj = new Object [ 1 ] ; paramsObj [ 0 ] = "参数值" ; //执行ShowPara方法,并接收返回值 object returnValue = type . GetMethod ( "ShowPara" , paramsType ) . Invoke ( instance , paramsObj ) ;

对于带参数的且没有无参构造函数的 ,使用上述方法构造实例会出错,可以使用System.Activator的CreateInstance(Type, Object)来构造实例:

    //获取类型,参数(命名空间.类)
    Type type = assembly.GetType("namespace.ClassName");
    //构造函数参数列表
    object[] parames = new Object[]{para1,para2,para3...};            
    //创建该对象的实例,object类型,参数(Type, Object)
    object instance = Activator.CreateInstance(type, parames);

静态方法的调用: 在GetMethod()时添加参数即可。
BindingFlags.NonPublic | BindingFlags.Static

object returnValue = type.GetMethod("FunName", BindingFlags.NonPublic | BindingFlags.Static).Invoke(instance, null);
  • 通过反射的方法查看外部DLL文件的类成员
 FieldInfo[] allFields = type.GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
Dictionary<string, object> allFieldsMap = new Dictionary<string, object>();
foreach (FieldInfo f in allFields)1
    allFieldsMap.Add(f.Name, f.GetValue(instance));
                    通过反射的方法调用外部DLL文件的函数(要事先知道DLL内的结构:命名空间、函数名称、函数参数类型等)// 依赖using System.Reflection;代码    //加载Dll文件    Assembly assembly = Assembly.LoadFile(@"dll的路径");    //获取类型,参数(命名空间.类名)    Type type = ass...
				
使用反射(Reflect)获取dll文件中的型并调用方法,具体内容如下 需引用:System.Reflection; 1. 使用反射(Reflect)获取dll文件中的型并调用方法(入门案例) static void Main(string[] args) //dll文件路径 string path = @D:\VS2015Project\001\Computer\bin\Debug\computer.dll; //加载dll文件 Assembly asm = Assembly.LoadFile(path);
首先说一下反射的优点:动态!!! 程序会被编译器编译成dll/exe,一般我们发布的都是这个东西,然后在运行的时候会被CLR/JIT编译成机器码。 为什么不直接通过编译器编译成机器码呢?答案就是:通过CLR/JIT可以根据不同的平台编译成不同的机器码,用以一次编译多平台运行。 微软提供的反射工具主要是 System.Reflection Assembly assembly1 = Assembly.LoadFile(@"D:\RefTest.dll");//完整路径 Assembly assembly2
string Path = System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location); Assembly assembly = Assembly.LoadFrom(Path + "\\" + dllName);
一般使用方法 [System.Runtime.InteropServices.DllImport("E:\\Project\\DLL\\XXX.dll", EntryPoint = "OpenComm", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)] public static extern int
反射提供描述程序集、模块和型的对象(Type型)。 可以使用反射动态地创建型的实例,将型绑定到现有对象,或从现有对象中获取型,然后调用其方法或访问器字段和属性。 如果代码中使用了特性,可以利用反射来访问它们
C#反射(Reflection) 反射指程序可以访问、检测和修改它本身状态或行为的一种能力。 程序集包含模块,而模块包含型,型又包含成员。反射则提供了封装程序集、模块和型的对象。 您可以使用反射动态地创建型的实例,将型绑定到现有对象,或从现有对象中获取型。然后,可以调用型的方法或访问其字段和属性。 1、反射提高了程序的灵活性和扩展性。 2、降低耦合...
1、已知调用 既然是已知了,为什么还用反射呢,因为这涉及到工厂模式,比如用数据库的文本来调用已知的里的方法,只要从数据库里获取到方法名以及参数,就可以通过以下方法,直接使用,程序单步的时候,就会发现带入的参数会被执行到所涉及的里的方法里去。 /// <summary> Assembly ass=Assembly.LoadFrom(DllPath); //利用dll路径加载,同时将此程序集所依赖的程序集加载进来,需后辍名.dll Assembly.LoadFile 只加载指定文件,并不会自动加载依赖程序集.Assmbly.Load无需后辍名,加载dll后,需要使用dll中某. Type type=ass.GetTyp...
今天研究了一下,当指定程序集、全名、方法名时,给定一个该的实例,如何调用该实例中指定的方法。 这个功能的背景是这样的: 1、程序中有多个窗体(都继承自Form),保存在一个数组中 2、因为作为父的Form我是不能新加入任何方法的,所以代码都是现在每个具体的页面里,也就是说,我们只能...
string str = System.IO.Directory.GetCurrentDirectory()+ "/det.dll"; Assembly asm = Assembly.LoadFile(str); var type = asm.GetType("Test.Det"