zoukankan      html  css  js  c++  java
  • 反射、反射加壳、反射脱壳、反射注册机(上)

    反射、反射加壳、反射脱壳、反射注册机(上)
          程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。
          反射的用途很大,在上节文章中的“晚期绑定”就是利用了反射的性质,在插件的编写上更是需要反射。我们常用的反编译工具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
  • 相关阅读:
    Android——继续深造——从安装Android Studio 2.0开始(详)
    PHP——安装wampserver丢失MSVCR110.dll
    Marza Gift for GDC 2016
    Retrieve OpenGL Context from Qt 5.5 on OSX
    Space Time Varying Color Palette
    Screen Space Depth Varying Glow based on Heat Diffusion
    Visualization of Detail Point Set by Local Algebraic Sphere Fitting
    Glass Dragon
    Jump Flood Algorithms for Centroidal Voronoi Tessellation
    京都之行
  • 原文地址:https://www.cnblogs.com/chengchen/p/1222545.html
Copyright © 2011-2022 走看看