• 反射、反射加壳、反射脱壳、反射注册机(上)


    反射、反射加壳、反射脱壳、反射注册机(上)
          程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。
          反射的用途很大,在上节文章中的“晚期绑定”就是利用了反射的性质,在插件的编写上更是需要反射。我们常用的反编译工具Refiector 也是用了反射的性质。
         我们今天就来写一个简单的类似于Refiector的东西,通过反射来获得程序集的多种信息。
    1、获得程序集所有的namespace

            
    public static ArrayList GetAllNameSpace(Assembly assembly)
            
    {
               ArrayList namePaceArry 
    = new ArrayList();
               
    foreach(Type type in assembly.GetTypes())
               
    {
                  
    if (!namePaceArry.Contains(type.Namespace) && type.Namespace != null)
                  
    {
                       namePaceArry.Add(type.Namespace);
                  }

               }

               
    return namePaceArry;
            }

    2、获得程序集的所有类
     
           public static ArrayList GetClassNames(Assembly assembly, string nameSpace)
            
    {
                Type[] types 
    = assembly.GetTypes();
                ArrayList classArray 
    = new ArrayList();
                
    foreach (Type type in types)
                
    {
                    
    if (type.FullName == nameSpace + "." + type.Name && type.BaseType.Name != "Enum")
                    
    {
                        classArray.Add(type.Name);
                    }

                }

                
    return classArray;
            }

    3、获得程序集的某一类中的所有方法

            
    public static MethodInfo [] GetMethod(Assembly assembly, string fullName)
            
    {
                Type type 
    = assembly.GetType(fullName);
                
    return type.GetMethods();
            }

    这里的fullName是包含namespace和类名合在一起的。

    4、获得程序集中的某一类中的所有属性
            public static PropertyInfo[] GetPropertys(Assembly assembly, string fullName)
            
    {
                Type type 
    = assembly.GetType(fullName);
                
    return type.GetProperties();
            }

    5、获得程序集的枚举类型
            public static ArrayList GetEnums(Assembly assembly, string nameSpace)
            
    {
                Type[] types 
    = assembly.GetTypes();
                ArrayList classArray 
    = new ArrayList();
                
    foreach (Type type in types)
                
    {
                    
    if (type.FullName == nameSpace + "." + type.Name && type.BaseType.Name == "Enum")
                    
    {
                        classArray.Add(type.Name);
                    }

                }

                
    return classArray;
            }


    6、获得程序集中枚举的内容,以及每项的值
            public static FieldInfo [] GetSubEnums(Assembly assembly, string fullName)
            
    {
                
    return assembly.GetType(fullName).GetFields();
            }


            
    public static string GetSubEnumsData(Assembly assembly, string fullName,string name)
            
    {
                FieldInfo info 
    = assembly.GetType(fullName).GetField(name);
                
    return info.GetRawConstantValue().ToString();
            }

    7、获得程序集中某一类的所有属性
            public static PropertyInfo[] GetPropertys(Assembly assembly, string fullName)
            
    {
                Type type 
    = assembly.GetType(fullName);
                
    return type.GetProperties();
            }

    8、获得程序集中某一具体方法的IL代码
            public static string GetMethodData(Assembly assembly, string fullName,string name, Type [] types)
            
    {
                Type type 
    = assembly.GetType(fullName);
                MethodInfo info 
    = type.GetMethod(name, types);
                
    string data = String.Empty;
                
    if (info.GetMethodBody() != null)
                
    {
                    
    byte[] il = info.GetMethodBody().GetILAsByteArray();
                    
    if (il != null)
                    
    {
                        
    int inslength;
                        
    for (int currentpos = 0;currentpos < il.Length;currentpos += inslength)
                        
    {
                            inslength 
    = 0;
                            data 
    += String.Format("{0:X8}: {1}", currentpos,Disassembler.Decode(il, currentpos, out inslength)) + "\r\n";
                        }

                    }

                    
    return data;
                }

                
    return "此函数不做反编译处理";
            }
    注意这里面的type是为了寻找重载方法而制定的参数,il = info.GetMethodBody().GetILAsByteArray()其实返回的是IL代码的二进制表达形式,而我们还需要把它转化为真正的IL代码,我写在类Disassembler.Decode(......)之中了,由于代码比较长大家可以下载附件源代码查看。


     附件下载: https://files.cnblogs.com/chengchen/CiCiReflection.rar
  • 相关阅读:
    开启Chrome内核浏览器的多线程下载功能
    golang fasthttp
    国内外短信接码平台合集
    jsrsasign 进行 RSA 加密、解密、签名、验签
    sysbench对自装MySQL数据库进行基准测试
    MySQL慢查询
    Logstash的配置
    简单的MySQL主从状态监控
    aria2c备忘
    DataX 整合后重新编译打包
  • 原文地址:https://www.cnblogs.com/chengchen/p/1222545.html
Copyright © 2020-2023  润新知