C#的反射Reflection

作用:用于查看别人写的  lookme.exe程序内有些什么

C#的反射Reflection_第1张图片

【1】准备材料:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace lookme
{
    public class me
    {
        int ziduan;
        int ziduan2 = 66;
        int 字段;
        int 字段2 = 77;

        public int shuxing { get; set; }
        public int shuxing2 { get; set; } = 77;
        public int 属性 { get; set; }
        public int 属性2 { get; set; } = 88;

        void fun()
        {
            int i = 0;
            i += 1;
        }
       public  int fun2()
        {
            ++ziduan;
            return ziduan;

            //++i;
            //return i;
        }
        void 方法()
        {
            int i=0;
            i+=1;
        }
       public  void 方法2()
        {
            int i = 0;
            i += 1;
        }

    }
}

C#的反射Reflection_第2张图片

就是个普通窗体,加个me的类。 C#的反射Reflection_第3张图片

 运行后会生成   exe文件

C#的反射Reflection_第4张图片

你把它复制出来。一会要用到它。

名称长格式:就是完全限定名。

【1】另外新建工程,引入反射的命名空间

//【1】引入反射的命名空间
using System.Reflection;// 反射

【2】加载程序集(加载      exe文件)

有3种加载模式:1加载exe程序(exe需要复制到当前 \bin\Debug  文件夹下)

                            2加载exe程序的文件夹路径(这个比较好)

                            3加载exe程序的程序集名称

Assembly ass1 = Assembly.LoadFrom("登录窗.exe");//需要将登录窗.exe文件复制到\bin\Debug文件下

Assembly ass2 = Assembly.LoadFile(System.IO.Directory.GetCurrentDirectory() + "\\InterfaceAndPolymorphism.exe");// 文件路径

Assembly ass3 = Assembly.Load("InterfaceAndPolymorphism");//程序集名称

用文件路径加载 .exe程序 比较好 

//  加载exe文件路径
try
   {
      //Assembly ass1 = Assembly.LoadFrom(assName);//需要将登录窗.exe文件复制到\bin\Debug文件下
      Assembly ass2 = Assembly.LoadFile(@"C:\Users\Administrator\Desktop\lookme\lookme\lookme\bin\Debug\lookme.exe");
      //Assembly ass3 = Assembly.Load("InterfaceAndPolymorphism");//程序集名称

      if (ass2 == null) throw new Exception();

      return ass2;
   }
catch (Exception ex)
   {
       MessageBox.Show(ex.Message);
       throw ex; 
   }//显示错误

这里不报错,不为空,说明  .exe 程序已经加载到你的项目里了。 

 【3】获取新建对象

.exe程序加载进来后,就可以取出它里面的成员了。

 1先查看里面有什么

 Type[] types = ass2.GetTypes();
            foreach (var item in types)
            {
                //item.Name:类的名称
                //item:类的完全限定名(命名空间+类名)
                Console.WriteLine(item.Name + "\t\t" + item);
            }

C#的反射Reflection_第5张图片

Form1是子窗体名称,me是我自己建的类。

C#的反射Reflection_第6张图片

 比如我想新建出 me 这个类,要用完全限定名。命名空间+类

object obj= ass2.CreateInstance("lookme.me");

C#的反射Reflection_第7张图片

这里 obj 已经能看到 me的属性了。需要想办法把 obj 强制转成 me 这个类。 一般用接口,就是me继承xxx接口,你另外的过程也有xxx接口,这样把me强制成接口

return (接口)Assembly.Load(程序集名称).CreateInstance(对象名称);//完全限定名
5. 反射调用普通方法步骤
	1. 动态加载DLL    Assembly assembly=Assembly.LoadFrom(@"DLL路径");
	2. 获取对象类型  Type type=assembly.GetType("对象名")
	3. 创建对象实例 Object otest=Activator.CreateInstance(类型);
	4. 获取方法     MethodInfo   show1=type.GetMethod("show2")
	5. Invoke方法(如果方法有参数,传递参数类型必须和方法一致) show1.Invoke(otest,new object[]{123});   show2.Invoke(otest,new object[0]);
	6. 如果调用的是重载方法在第四步获取方法时要写对方法参数类型和参数数目(好像也有封装好可以不写具体参数,直接在调用时写明即可)

【2】准备查看   exe内的成员:

另外新建一个工程,你把它复制到工程的相对路径。也在Debug文件下,lookme复制进去

 C#的反射Reflection_第8张图片

 C#的反射Reflection_第9张图片

这段程序就是加载exe文件,这样就可以剖腹看看里面有些什么:

C#的反射Reflection_第10张图片

这里就扒出了 me 这个类内, 属性,方法了

你可能感兴趣的:(C#中级,c#)