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

反射、反射加壳、反射脱壳、反射注册机(上)
      程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。
      反射的用途很大,在上节文章中的“晚期绑定”就是利用了反射的性质,在插件的编写上更是需要反射。我们常用的反编译工具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

posted on 2008-06-15 13:41  程晨  阅读(2816)  评论(5编辑  收藏  举报

导航